从层次结构中的顶级调用方法而不是覆盖

时间:2011-05-03 15:03:20

标签: python oop inheritance

假设我有课程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

这种方法似乎有效,从域名的角度来看,它很有道理,但不知怎的,它闻起来有点可疑。这是要走的路,还是我应该重构?

3 个答案:

答案 0 :(得分:3)

的答案是使用super()功能。您正在做的方式完全正确,因为您不想调用在超类中重写的虚方法。由于您似乎一直希望基类完全实现,唯一的方法是将基类'未绑定方法对象返回,将其绑定到self,这可能是一个BaseDerived的实例。通过显式提供self调用未绑定方法,因为第一个参数会返回绑定方法。从现在开始,Base.foo将对实例self的数据进行操作。这是完全可以接受的,也是Python处理非虚方法调用的方式。这是Python允许你做的好事之一,Java没有。

答案 1 :(得分:2)

建议:

def learn_to_foo(self, x):
  super(Derived, self).foo(x)

http://docs.python.org/library/functions.html#super

的更多信息

答案 2 :(得分:1)

另一种方法是使用'super'内置:

super(Derived, self).foo(x)     # Python 2

super().foo(x)                  # Python 3