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

2024-05-23 23:42:22 发布

您现在位置:Python中文网/ 问答频道 /正文

此代码引发异常,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()

Tags: 方法代码selfreturnobjectfoodefclass
3条回答

在类A中,您需要调用A方法并手动传入self,而不是调用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()

在代码中:

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

self是B的一个例子

当从a派生的方法被B的实例调用时,它将开始在B的命名空间中查找,并且只有在找不到该方法(例如没有被B重写)时,才使用a的实现,但始终自引用B。在任何情况下,self都不是a的实例

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

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

 class A(object):

    def foo(self):
        A.foo1(self)

相关问题 更多 >