python多重繼承/多繼承相關

1 使用父類名.方法名調用父類方法

class Parent():
    def __init__(self,name):
        self.name = name
        print("Parent的init方法被調用")

class Son1(Parent):
    def __init__(self,name,age):
        self.age = age
        Parent.__init__(self,name)
        print("Son1的init方法被調用")


class Son2(Parent):
    def __init__(self,name,gender):
        self.gender = gender
        Parent.__init__(self,name)
        print("Son2的init方法被調用")


class Grandson(Son1,Son2):
    def __init__(self,name,age,gender):
        Son1.__init__(self,name,age)
        Son2.__init__(self,name,gender)
        print("Grandson的init方法被調用")


g = Grandson("laowang",22,"男")

輸出結果:

Parent的init方法被調用
Son1的init方法被調用
Parent的init方法被調用
Son2的init方法被調用
Grandson的init方法被調用

2 使用super().方法名的方式調用父類方法:

class Parent():
    def __init__(self,*args):
        self.name = args[2]
        print("Parent的init方法被調用")

class Son1(Parent):
    def __init__(self,*args):
        name,self.age,gender = args
        super().__init__(*args)
        print("Son1的init方法被調用")


class Son2(Parent):
    def __init__(self,*args):
        name,age,self.gender = args
        super().__init__(*args)
        print("Son2的init方法被調用")


class Grandson(Son1,Son2):
    def __init__(self,name,age,gender):
        super().__init__(name,age,gender)
        print("Grandson的init方法被調用")


g = Grandson("laowang",22,"男")
print(Grandson.__mro__)

輸出結果:

Parent的init方法被調用
Son2的init方法被調用
Son1的init方法被調用
Grandson的init方法被調用
(<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.Parent'>, <class 'object'>)

 

由上述代碼得出結論:

使用父類名.方法名()方式調用父類方法在多重繼承中會造成父類被重複調用。

而使用super().方法名()方式調用父類方法則不會重複調用。

 

關於使用super()調用父類方法時代碼的執行順序:

使用類名.__mro__可以查看當前類的多重繼承執行順序,該執行順序是使用C3算法計算得出。

而C3算法使用的是BFS算法(廣度優先搜索算法),在二叉樹中表現爲儘可能的尋找更多分叉。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章