我只有一个关于初始化的小问题。在Python中,当我们进行Multiply继承时,调用子类的超级函数和分别调用它们有什么区别?
classA(B,C)
super(A,self).__init__()
#---and---#
B.__init__(self)
C.__init__(self)
谢谢
主要区别在于,如果类 B 和 C 有一个共同的祖先,那么通过super()
调用,该祖先__init__()
只会被调用一次。通过在您的示例中显式调用父母的__init__()
方法,共同祖先的__init__()
最终将被调用两次。
您可以从Guido 的解释中了解如何super()
做到这一点。
下面是对父母的显式调用__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>
>>>