假设我有类 Base(object)
和 Derived(Base)
。它们都实现了函数 foo
,其中 Derived.foo
覆盖 Base
中的版本。
但是,在其中一种方法中,例如Base.learn_to_foo
,我想调用Base.foo
而不是派生版本,无论它是否被覆盖。因此,我在该方法中调用 Base.foo(self)
:
class Base(object):
# ...
def learn_to_foo(self, x):
y = Base.foo(self, x)
# check if we foo'd correctly, do interesting stuff
这种方法似乎有效,从领域的角度来看,它非常有意义,但不知怎的,它闻起来有点可疑。这是要走的路,还是应该重构?
最佳答案
答案是不使用super()
函数。您所做的方式完全正确,因为您不想调用父类(super class)中重写的虚拟方法。由于您似乎一直希望基类的精确实现,唯一的方法是获取基类的未绑定(bind)方法对象,将其绑定(bind)到self
,这可以是Base
或Derived
的实例。使用显式提供的 self
调用未绑定(bind)方法,因为第一个参数会返回一个绑定(bind)方法。从现在开始,Base.foo
将作用于实例 self
的数据。这是完全可以接受的,也是 Python 处理非虚拟方法调用的方式。这是 Python 允许您做而 Java 却做不到的好事之一。
关于python - 从层次结构中的顶级类调用方法而不是覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5871542/