<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
版本:
在Python數位比較與類結構中有簡略提到類,且在Python中類的mro與繼承關係詳解稍有解釋繼承關係,用到一個基礎類別Animal
如下:
class Animal: property_ = '能夠思考' def __init__(self, name, age, value): self.name_ = name self.age_ = age self.val_ = val
再定義Action
活動作為另一個基礎類別:
class Action: def __init__(self, action, val): self.action_ = action self.val_ = val
Dog
類,不僅是動物,還能夠跑,可以來繼承上面兩個類來定義:class Dog(Animal, Action): def __init__(self, name, age, action, val): Animal.__init__(self, name, age, val+1) Action.__init__(self, action, val) dog = Dog('大福', 8, '跑', 78) print(dog.__dict__) # {'name_': '大福', 'age_': 8, 'val_': 78, 'action_': '跑'}
發現列印出的範例屬性,好像字典的鍵值更新,先初始化Animal時,val傳入的值為79,而後被更新為78,這裡為什麼不能像繼承單個類一樣直接用super方法代替呢。
上一篇有提到mro解析順序,可進行嘗試,不重寫__init__方法,發現Dog
類只能傳入三個引數,且都為Animal
類的引數,因為繼承的兩個父類別都有該方法,優先繼承左邊的父類別方法,如果想都繼承可以考慮這樣的形式,然而會提高後續維護的困難性。
可以將最左邊的父類別改成super方式:
class Dog(Animal, Action): def __init__(self, name, age, action, val): super().__init__(name, age, val+1) Action.__init__(self, action, val)
mro解析順序,與上面所述一致:
Dog.mro() # [__main__.Dog, __main__.Animal, __main__.Action, object]
如再進行繼承,視Dog
為父類別,其Animal
,Action
都為祖父類別,定義一個Pet
類:
class Pet(Dog): pass pet = Pet('大福', 8, '跑', 78)
傳入引數,和範例化的物件跟Dog
一樣,如果需要改寫某個方法,可以參照之前的方法進行改寫,另外若在保留原方法的邏輯上進行補充則用super方法。
Pet
類的mro:
Pet.mro() # [__main__.Pet, __main__.Dog, __main__.Animal, __main__.Action, object]
通過上面的繼承及對應的mro解析順序,可以思考以下通過多重繼承類後,輸出的x屬性值為多少:
class Alpha: def __init__(self, val): self.x = val class Beta(Alpha): pass class Gamma: def __init__(self, val): self.x = val + 1 class Omega(Gamma): def __init__(self, val): super().__init__(val + 1) class Kappa(Beta, Omega): pass k = Kappa(1) print(k.x)
如果腦內沒有一個mro解析順序圖,這裡準備了:
[__main__.Kappa, __main__.Beta, __main__.Alpha, __main__.Omega, __main__.Gamma, object]
這裡或許會有疑問,Beta
後面不是Omega
嗎?怎麼到Alpha
了,可以先看下Omega
,繼承Gamma
,而Gamma
跟Alpha
並不是同源的,類似於Dog
類的繼承,那麼優先就會使用Alpha
的__init__方法,所以在傳入引數值1的時候,僅執行了Alpha
內的self.x = val,屬性x被賦值成1,在最後print輸出即為1,列印結果檢查:
print(k.x) # 1
若把Gamma
類改成繼承Alpha
類,再次猜測print(k.x)的值為多少?
class Alpha: def __init__(self, val): self.x = val class Beta(Alpha): pass class Gamma(Alpha): def __init__(self, val): self.x = val + 1 class Omega(Gamma): def __init__(self, val): super().__init__(val + 1) class Kappa(Beta, Omega): pass k = Kappa(1) print(k.x)
檢視mro解析順序:
[__main__.Kappa, __main__.Beta, __main__.Omega, __main__.Gamma, __main__.Alpha, object]
此時發現Alpha
解析優先順序排在最後,Beta
跟Omega
可以看做是Beta
跟Gamma
的優先順序比較,因為Omega
繼承Gamma
,且重寫了__init__方法,所以當傳入引數時會對Gamma
類的屬性進行賦值,雖然Beta
類直接繼承Alpha
,但Gamma
類也直接繼承,所以Alpha
解析順序需要排在Gamma
後面,從而當Kappa
類傳入引數時,經過Omega
的super加1,傳入到Gamma處時為:self.x = val + 1中的val為2,輸出的k.x的值即為3,檢視列印結果:
print(k.x) # 3
通過連續兩篇對類繼承及mro解析順序的說明,理解類在多重繼承中的變化,無論繼承多少遍,總歸要回歸本心,但也不能胡亂繼承,有條理的,有意義的繼承,才能讓自己乃至他人更好理解當下寫出的類。
到此這篇關於Python中類的mro與繼承關係詳解的文章就介紹到這了,更多相關Python mro內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45