3 回答
TA贡献1874条经验 获得超12个赞
我不完全明白为什么会这样,但我可以告诉你如何解决它:
出于某种原因,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}
TA贡献2016条经验 获得超9个赞
当一个类从多个超类继承,并且有 2 个或更多冲突方法时,将调用第一个列出的类中的方法。因为两者Base1
和Base2
定义__init__
,__init__
在第一个列出的类中的版本被调用,因此没有定义这两个属性。
TA贡献1752条经验 获得超4个赞
这在Python docs 中有更好的解释。
对于大多数目的,在最简单的情况下,您可以将搜索从父类继承的属性视为深度优先,从左到右,而不是在层次结构重叠的同一类中搜索两次。因此,如果在 DerivedClassName 中找不到属性,则在 Base1 中搜索它,然后(递归地)在 Base1 的基类中搜索,如果在那里找不到,则在 Base2 中搜索,依此类推。
然后,就像__init__
在你左边的班级中第一次找到的那样,它不会寻找其他人。正如其他用户所解释的,super()
应该用于让 Python 知道如何寻找其他__init__
方法。
添加回答
举报