2013-02-25 189 views
1

我只是有一个关于初始化的小问题。在Python中,当我们做一个Multiply继承时,调用子类的超级函数并将它们分开调用的区别是什么?类初始化

classA(B,C) 

super(A,self).__init__() 

#---and---# 

B.__init__(self) 
C.__init__(self) 

感谢

+0

会发生什么你的意思是在''''__init __()'方法的*里放置'super()'*?请修复你的代码,这段代码会生成(显而易见的)IndentationError,以及'classA'的NameError。 – 2013-02-25 15:04:40

+0

哦,对不起。我简单地写了:D – illunara 2013-02-25 15:16:19

回答

1

的主要区别是,如果类B和C有着共同的祖先,与super()呼叫,该祖先的__init__()才会被调用一次。通过明确地调用父母的__init__()方法,共同祖先的__init__()将最终被调用两次。

你可以阅读关于super()如何从Guido's explanation完成此操作。

下面是显式调用的示范家长__init__()以及它如何调用共同的祖先两次:

>>> class A(object): 
... def __init__(self): 
...  print "A" 
... 
>>> class B(A): 
... def __init__(self): 
...  A.__init__(self) 
...  print "B" 
... 
>>> class C(A): 
... def __init__(self): 
...  A.__init__(self) 
...  print "C" 
... 
>>> class D(B,C): 
... def __init__(self): 
...  B.__init__(self) 
...  C.__init__(self) 
...  print "D" 
... 
>>> D() 
A 
B 
A 
C 
D 
<__main__.D object at 0x106de1d10> 
>>> 

这是super()

>>> class A(object): 
... def __init__(self): 
...  print "A" 
... 
>>> class B(A): 
... def __init__(self): 
...  super(B,self).__init__() 
...  print "B" 
... 
>>> class C(A): 
... def __init__(self): 
...  super(C,self).__init__() 
...  print "C" 
... 
>>> class D(B,C): 
... def __init__(self): 
...  super(D,self).__init__() 
...  print "D" 
... 
>>> D() 
A 
C 
B 
D 
<__main__.D object at 0x10d34ec90> 
>>> 
+0

啊,我明白了。感谢了很多:D – illunara 2013-02-25 15:26:50