最佳答案
假设我有一个多重继承的场景:
class A(object):
# code for A here
class B(object):
# code for B here
class C(A, B):
def __init__(self):
# What's the right code to write here to ensure
# A.__init__ and B.__init__ get called?
有两种典型的方法来编写C
的__init__
:
ParentClass.__init__(self)
super(DerivedClass, self).__init__()
然而,在这两种情况下,如果父类(A
和B
) 如果不遵循相同的约定,那么代码将无法正常工作(有些可能会被错过,或被多次调用)。
正确的方法是什么来着?说“只要保持一致,遵循一个或另一个”很容易,但如果A
或B
来自第三方库,那么怎么办?是否有一种方法可以确保所有父类构造函数都被调用(并且以正确的顺序,并且只调用一次)?
编辑:看看我的意思,如果我这样做:
class A(object):
def __init__(self):
print("Entering A")
super(A, self).__init__()
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class C(A, B):
def __init__(self):
print("Entering C")
A.__init__(self)
B.__init__(self)
print("Leaving C")
然后我得到:
Entering C
Entering A
Entering B
Leaving B
Leaving A
Entering B
Leaving B
Leaving C
注意B
的init会被调用两次。如果我这样做:
class A(object):
def __init__(self):
print("Entering A")
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class C(A, B):
def __init__(self):
print("Entering C")
super(C, self).__init__()
print("Leaving C")
然后我得到:
Entering C
Entering A
Leaving A
Leaving C
注意B
的init从未被调用。因此,似乎除非我知道/控制继承自(A
和B
)的类的初始化,否则我无法为我正在编写的类(C
)做出安全的选择。