为了账号安全,请及时绑定邮箱和手机立即绑定

多重继承:派生类只从一个基类获取属性?

多重继承:派生类只从一个基类获取属性?

慕慕森 2021-07-20 13:01:27
我试图在 Python 中学习多重继承的概念。考虑Derv从两个类派生的类,Base1和Base2。Derv仅从第一个基类继承成员:class Base1:    def __init__(self):        self.x=10class Base2:    def __init__(self):        self.y=10class Derv (Base1, Base2):    passd = Derv()print (d.__dict__)结果是{ 'x' : 10 }颠倒继承顺序只给出{ 'y' : 10 }.派生类不应该继承两个基类的属性吗?
查看完整描述

3 回答

?
HUWWW

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}


查看完整回答
反对 回复 2021-07-28
?
慕沐林林

TA贡献2016条经验 获得超9个赞

当一个类从多个超类继承,并且有 2 个或更多冲突方法时,将调用第一个列出的类中的方法。因为两者Base1Base2定义__init____init__在第一个列出的类中的版本被调用,因此没有定义这两个属性。


查看完整回答
反对 回复 2021-07-28
?
温温酱

TA贡献1752条经验 获得超4个赞

这在Python docs 中有更好的解释。

对于大多数目的,在最简单的情况下,您可以将搜索从父类继承的属性视为深度优先,从左到右,而不是在层次结构重叠的同一类中搜索两次。因此,如果在 DerivedClassName 中找不到属性,则在 Base1 中搜索它,然后(递归地)在 Base1 的基类中搜索,如果在那里找不到,则在 Base2 中搜索,依此类推。

然后,就像__init__在你左边的班级中第一次找到的那样,它不会寻找其他人。正如其他用户所解释的,super()应该用于让 Python 知道如何寻找其他__init__方法。


查看完整回答
反对 回复 2021-07-28
  • 3 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信