【问题标题】:Python Multiple inheritance not printing result as expectedPython多重继承未按预期打印结果
【发布时间】:2021-08-20 08:09:10
【问题描述】:

我有一个类似下面的代码。我试图测试 python 的多重继承行为。我有一个名为 Base 的基类,当 D3 派生自 D1、D2 时,D1 和 D2 派生自基类。 我首先初始化 D2,然后从 D3 初始化 D1。我用 val= 1 初始化 D3 ,用 D3.val+2 初始化 D2 ,用 D3.val+4 初始化 D1 。但是当我打印所有类的 init 值时,我注意到 D1 正在临时初始化为 3。

`

class Base:
    def __init__(self,val):
        print ("Base __init__",val)
        self.b_data = val
    def whoami(self):
        print ("I am Base")
    def val(self):
        print ("val of Base",self.b_data)

    def __del__(self):
        print ("Deleting Base")

  class D1(Base):

    def __init__(self,val):
        print ("D1 __init__",val)
        self.d1_data = val 
        super().__init__(self.d1_data)

    def whoami(self):
        print ("I am D1")
    def __del__(self):
        print ("Deleting D1")



class D2(Base):

    def __init__(self,val):
        print ("D2 __init__",val)
        self.d2_data = val +2
        super().__init__(self.d2_data)

    def whoami(self):
        print ("I am D2")
    def __del__(self):
        print ("Deleting D2")


class D3(D2,D1):

    def __init__(self,val):
        print ("D3 __init__",val)
        self.d3_data = val 

        super().__init__(self.d3_data) #callig D2 init
        super(D2,self).__init__(self.d3_data+4) #calling D1 init        
        #D2.__init__(self,100)

    def __del__(self):
        print ("Deleting D3")

if( __name__ == "__main__"):
    objD3 = D3(1)
    print ((objD3.__class__.__mro__))
    objD3.val()
    objD3.whoami()
`

但是当我运行它时,结果显示为

D3 __init__ 1
D2 __init__ 1
D1 __init__ 3
Base __init__ 3
D1 __init__ 5
Base __init__ 5
(<class '__main__.D3'>, <class '__main__.D2'>, <class '__main__.D1'>, <class '__main__.Base'>, <class 'object'>)
val of Base 5
I am D2
Deleting D3

你能帮我理解为什么在第三行打印D1 __ init__ 3,当我没有用值 3 初始化 D1 时?

【问题讨论】:

    标签: python diamond-problem


    【解决方案1】:

    super 可能不是您所期望的。 Python有一个方法解析顺序的概念,如果你用print(D3.__mro__)控制D3是什么,你会发现:

    (<class '__main__.D3'>, <class '__main__.D2'>, <class '__main__.D1'>, <class '__main__.Base'>, <class 'object'>)
    

    super()D2.__init__ 中用于D3 对象时,它会将代理返回到self.__class__.__mro__ 中的下一个类,即D1 而不是Base。因此,它会调用D1.__init__(3)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多