假设我有一个多重继承场景:
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
's __init__
:
- (老式)
ParentClass.__init__(self)
- (较新风格)
super(DerivedClass, self).__init__()
但是,无论哪种情况,如果父类 (A
and B
) 不遵循相同的约定,那么代码将无法正常工作 http://fuhm.org/super-harmful/(有些可能会错过,或被多次呼叫)。
那么正确的方法又是什么呢?说“保持一致,遵循其中一个或另一个”很容易,但如果A
or 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
and B
)我无法为我正在写的课程做出安全的选择(C
).