调用重写方法,超类调用重写方法

Per*_*tes 15 python inheritance superclass

此代码抛出异常,AttributeError,"wtf!" ,因为A.foo()是打电话B.foo1(),不应该打电话A.foo1()吗?如何强制它调用A.foo1()(内部的任何方法调用A.foo()都应该调用A.*)

class A(object):
    def foo(self):
        print self.foo1()

    def foo1(self):
        return "foo"

class B(A):
    def foo1(self):
        raise AttributeError, "wtf!"

    def foo(self):
        raise AttributeError, "wtf!"

    def foo2(self):
        super(B, self).foo()

myB = B()
myB.foo2()
Run Code Online (Sandbox Code Playgroud)

Eth*_*man 8

在A类而不是调用self方法时,您需要调用A方法并self手动传入.

这不是正常的做事方式 - 你应该有一个非常好的理由这样做.

class A(object):
    def foo(self):
        print A.foo1(self)

    def foo1(self):
        return "foo"

class B(A):
    def foo1(self):
        raise AttributeError, "wtf!"

    def foo(self):
        raise AttributeError, "wtf!"

    def foo2(self):
        super(B, self).foo()

myB = B()
myB.foo2()
Run Code Online (Sandbox Code Playgroud)


Mik*_*maa 6

它按预期工作,因为100%的世界编程语言都有效.子类重写父类的所有方法.

但是,如果你真的想要调用A.foo1(),你可能会这样做(我无法保证).无论如何你不能这样做,因为这违背了良好编程的所有原则.

 class A(object):

    def foo(self):
        A.foo1(self)
Run Code Online (Sandbox Code Playgroud)


ext*_*eon 5

在代码中:

def foo2(self):
    super(B, self).foo()
Run Code Online (Sandbox Code Playgroud)

self 是 B 的一个实例。

当 B 的实例调用从 A 派生的方法时,它将开始在 B 的命名空间中查找,并且仅当未找到该方法(例如未被 B 覆盖)时,才使用 A 的实现,但始终使用 self指的是 B。 self 绝不是 A 的一个实例。