Skip to main content
 首页 » 编程设计

python之多重继承 : The derived class gets attributes from one base class only

2025年05月04日16lonelyxmas

我正在尝试学习 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}