假设我有多个继承方案:
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
)做出安全选择。