关于python:类初始化

Class Initialization

本问题已经有最佳答案,请猛点这里访问。

关于初始化,我只有一个小问题。在Python中,当我们执行乘法继承时,调用子类的超级函数和分别调用它们之间有什么区别?

1
2
3
4
5
6
7
8
classA(B,C)

super(A,self).__init__()

#---and---#

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

谢谢


主要的区别是,如果B类和C类有一个共同的祖先,用super()调用,那么该祖先的__init__()只会调用一次。通过像在您的示例中那样显式地调用父代的__init__()方法,共同祖先的__init__()最终将被调用两次。

您可以从guido的解释中了解到super()是如何实现这一点的。

下面演示了对父母的__init__()的明确调用,以及如何两次调用共同祖先:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
>>> 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()的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>>> 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>
>>>