在下面的代碼中,我用數字替換了 args 來演示繼承了哪些類。
class Animal:
def __init__(self, animalName):
print(animalName, 'is an animal.');
class Mammal(Animal):
def __init__(self, mammalName):
print(mammalName, 'is a mammal.')
super().__init__(mammalName)
class CannotFly(Mammal):
def __init__(self, mammalThatCantFly):
print('2', "cannot fly.")
super().__init__('2')
class CannotSwim(Mammal):
def __init__(self, mammalThatCantSwim):
print('1', "cannot swim.")
super().__init__('1')
# Cat inherits CannotSwim and CannotFly
class Cat(CannotSwim, CannotFly):
def __init__(self):
print('I am a cat.');
super().__init__('Cat')
cat = Cat()
回傳
I am a cat.
1 cannot swim.
2 cannot fly.
2 is a mammal.
2 is an animal.
為什么不是下面?
I am a cat.
1 cannot swim.
1 is a mammal.
1 is an animal.
2 cannot fly.
2 is a mammal.
2 is an animal.
實際上有兩個呼叫流,不是嗎?
uj5u.com熱心網友回復:
您可以查看以下的方法決議順序 (MRO) Cat:
>>> Cat.mro()
[<class '__main__.Cat'>, <class '__main__.CannotSwim'>, <class '__main__.CannotFly'>, <class '__main__.Mammal'>, <class '__main__.Animal'>, <class 'object'>]
由于C3 線性化演算法,每個類在 MRO 中出現一次。簡而言之,這使用一些簡單的規則從繼承圖構造 MRO:
- 圖表中的每個類出現一次。
- 每個類都在其任何父類之前。
- 當一個班級有兩個父母時,父母的從左到右的順序被保留。
(“線性化”,因為它在繼承圖中產生節點的線性排序。)
super()名稱錯誤;一個更好的名字將會像是謊言nextclass,因為它并沒有使用當前類的家長名單,但的MROself說法。當您呼叫 時Cat,您會看到以下呼叫。
Cat.__init__Cat.__init__用途super呼叫CannotSwim.__init__CannotSwim.__init__用途super呼叫CannotFly.__init__CannotFly.__init__用途super呼叫Mammal.__init__Mammal.__init__用途super呼叫Animal.__init__Animal.__init__用途super呼叫object.__init__
object.__init__不使用super(它“擁有” __init__),所以鏈在那里結束。
特別是,注意 #3:CannotSwim導致使用繼承圖中的“兄弟”,而不是其自己的父級。
uj5u.com熱心網友回復:
看看這篇文章'super' 在 Python 中做了什么?- super().__init__() 和顯式超類 __init__() 之間的區別
現在它說的是__init__實體mro中的每個類都呼叫它。你可以列印出來,這樣做print(Cat.__mro__)會列印出來
(<class '__main__.Cat'>, <class '__main__.CannotSwim'>, <class '__main__.CannotFly'>, <class '__main__.Mammal'>, <class '__main__.Animal'>, <class 'object'>)
正如你所看到的,有呼叫的順序。現在,為什么使用“2”而不是“1”,請參閱 hussic 評論中的答案
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/407836.html
標籤:
上一篇:關于UML類圖中關聯類的問題
