2011-02-24 61 views
0

对于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() 

回答

1

只要你正在处理像你给的例子那样的单继承类, 没有太大的区别。无论哪种情况,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)调用该特定的方法。

0

所不同的是,B后代可以适当参与多态性,因为如果覆盖了它们foo()方法将被调用,而C没有这个选项。

0

假设B本身定义foo方法,然后将self.foo()调用fooB的版本。在C的实现中,super调用确保调用Afoo版本,即使C也定义了foo