class Animal:
def set_health(self, health):
print("Set in Animal")
class Carnivour(Animal):
def set_health(self, health):
super().set_health(health)
print("Set in Canivour")
class Mammal(Animal):
def set_health(self,health):
super().set_health(health)
print("Set in Mammal")
class Dog(Carnivour, Mammal):
def set_health(self, health):
super().set_health(health)
print("Set in dog")
dog = Dog()
dog.set_health(10)
我知道 Python 從左到右讀取這種代碼結構。但是我不明白當我們在課堂上交換Carnivourwith時它是如何改變輸出的。MammalDog()
有人可以詳細解釋一下它是如何讀取輸出列印的代碼的嗎
Set in animal
Set in Mammal
Set in Carnivour
Set in dog
當我們有全班Carnivour第一時Dog()
感謝幫助和理解
uj5u.com熱心網友回復:
您正在尋找方法決議順序或 MRO(鏈接的文章適用于 Python 2.3,但與大多數以 Python-2 為中心的文章不同,這篇文章實際上在今天仍然適用)。當你有多重繼承時,Python 會線性化繼承層次以找出super應該去哪里。就您而言,在您發布的代碼中,MRO 是
Dog < Carnivour < Mammal < Animal
如果你交換繼承順序Dog,你會得到
Dog < Mammal < Carnivour < Animal
由于您在列印之前super進行了“遞回”呼叫,因此陳述句以與繼承層次結構相反的順序出現。print
您可以在上面的鏈接中閱讀有關 Python 中用于 MRO 的 C3 線性化演算法的所有詳細資訊,但基本思想是:始終首先遵循最左邊的子類,除非這樣做會發生一些無意義的事情,其中??“無意義的事情”實際上意味著“在線性化中,超類出現在其子類之前”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/479834.html
