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)
在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)
它按预期工作,因为100%的世界编程语言都有效.子类重写父类的所有方法.
但是,如果你真的想要调用A.foo1(),你可能会这样做(我无法保证).无论如何你不能这样做,因为这违背了良好编程的所有原则.
class A(object):
def foo(self):
A.foo1(self)
Run Code Online (Sandbox Code Playgroud)
在代码中:
def foo2(self):
super(B, self).foo()
Run Code Online (Sandbox Code Playgroud)
self 是 B 的一个实例。
当 B 的实例调用从 A 派生的方法时,它将开始在 B 的命名空间中查找,并且仅当未找到该方法(例如未被 B 覆盖)时,才使用 A 的实现,但始终使用 self指的是 B。 self 绝不是 A 的一个实例。