我正在尝试学习 Python 中多重继承的概念。考虑从两个类派生的类 Derv,Base1 和 Base2。 Derv 仅从第一个基类继承成员:
class Base1:
def __init__(self):
self.x=10
class Base2:
def __init__(self):
self.y=10
class Derv (Base1, Base2):
pass
d = Derv()
print (d.__dict__)
结果是 { 'x' : 10 } 并且颠倒继承顺序只会得到 { 'y' : 10 } 。
派生类不应该继承两个基类的属性吗?
请您参考如下方法:
我不完全明白为什么会这样,但我可以告诉你如何解决它:
出于某种原因,Python 只调用其父类之一的 __init__ 方法。但是,这可以解决您的问题:
class Base1:
def __init__(self):
super().__init__()
print('b1')
self.x=10
class Base2:
def __init__(self):
super().__init__() # This line isn't needed. Still not sure why
print('b2')
self.y=10
class Derv (Base1, Base2):
def __init__(self):
super().__init__()
d = Derv()
print (d.__dict__)
'b2'
'b1'
{'y': 10, 'x': 10}
更新,添加打印语句实际上说明了一些情况。例如,
class Base1:
def __init__(self):
print('Before Base1 call to super()')
super().__init__()
print('b1')
self.x=10
class Base2:
def __init__(self):
print('Before Base2 call to super()')
super().__init__() # No remaining super classes to call
print('b2')
self.y=10
class Derv (Base1, Base2):
def __init__(self):
super().__init__()
d = Derv()
print (d.__dict__)
'Before Base1 call to super()' # Just before the call to super
'Before Base2 call to super()' # Just before call to super (but there are no more super classes)
'b2' # Calls the remaining super's __init__
'b1' # Finishes Base1 __init__
{'y': 10, 'x': 10}
