对于Python 2.5及更高版本,使用新样式类,以下代码片段用于调用子类中的继承方法有什么区别?在子类中调用继承方法的区别?
class A(object):
def foo(self):
pass
class B(A):
def __init__(self):
self.foo()
class C(A):
def __init__(self):
super(C, self).foo()
对于Python 2.5及更高版本,使用新样式类,以下代码片段用于调用子类中的继承方法有什么区别?在子类中调用继承方法的区别?
class A(object):
def foo(self):
pass
class B(A):
def __init__(self):
self.foo()
class C(A):
def __init__(self):
super(C, self).foo()
只要你正在处理像你给的例子那样的单继承类, 没有太大的区别。无论哪种情况,python都会使用方法解析顺序(mro) (您可以通过打印C.__mro__
来检查)以找出方法 foo的第一次发生。这些都解决你的基类,A的foo实现。
但是,当你有多重继承时,事情会变得有趣。请看下面的 例如:
class W(object):
def foo(self):
print "W"
class X(W):
def foo(self):
#super(X,self).foo()
W.foo(self)
print "X"
class Y(W):
def foo(self):
print "Y"
class Z(X,Y):
def __init__(self):
self.foo()
Z.__mro__
z = Z()
如果你看一下X类,我们可以用超级调用X的基类,或者我们 可以使用直接调用基类W.的区别是,当使用超级时,python 不寻找具体的实现,而是当前mro列表中的第一个实现 。用于Z的MRO列表是:
(Z,X,Y,W)
因此,使用超一将打印: Y X
而这直接调用基的一个将打印: W X
基本上,使用超级动态调用在MRO第一实施中发现,而class.foo(或在您的情况下的self.foo)调用该特定的方法。
所不同的是,B
后代可以适当参与多态性,因为如果覆盖了它们foo()
方法将被调用,而C
没有这个选项。
假设B
本身定义foo
方法,然后将self.foo()
调用foo
B
的版本。在C
的实现中,super
调用确保调用A
的foo
版本,即使C
也定义了foo
。