Python中類的mro與繼承關系詳解
前言
版本:
- windows 10.0
- python 3.8
類
在Python數(shù)字比較與類結構中有簡略提到類,那么什么是類呢?
在python中定義一個類很簡單,使用關鍵字class
就能實現(xiàn)。
class Animal: pass
如何使用它,在類結構中稱作實例化。
animal = Animal()
這樣,就有了一個Animal的實例。
繼承
類的其中一個特性就是能夠繼承,把Animal
類豐富下,將其作為基類:
class Animal: property_ = '能夠思考' def __init__(self, name, age, value): self.name_ = name self.age_ = age self.val_ = val
在這里面,property_作為類屬性,無需實例化就能使用,而__init__下的self.name_, self.age_和self.val_需要在實例化后才能使用,且這里__init__需要傳入?yún)?shù),其中self用來指代類本身,不作為傳參值。
print(Animal.property_) # 輸出:能夠思考 print(Animal.name_) # 引發(fā)AttributeError錯誤 a = Animal('阿黑', 12, 70) print(a.property_) # 能夠思考 print(a.name_) # 阿黑 print(a.age_) # 12 print(a.val_) # 70 復制代碼
Animal
類可以正常使用,再寫一個Monkey
類,繼承Animal
類。
class Monkey(Animal): pass
在Monkey
后面調用Animal
類,繼承了其屬性及方法,也可通過實例化,查看Monkey
實例的屬性。
print(Monkey.property_) # 類屬性: 能夠思考 m = Monkey('阿黃', 15, 40) print(m.name_) # 阿黃 print(m.age_) # 15 print(m.val_) # 40
當然也能繼承類,對其已有的方法進行改寫,這里再定義一個Cat
類。
class Cat(Animal): def __init__(self, name, age): self.name_ = '我是' + name self.age_ = age
Cat
類繼承后對__init__進行了改寫,修改了name_,并且刪除了val_。
print(Cat.property_) # 類屬性:能夠思考 c = Cat('小花', 6) print(c.name_) # 我是小花 print(c.age_) # 6 print(c.val_) # 引發(fā)AttributeError報錯
對于類屬性還是能使用,不見的val_再調用就會引發(fā)報錯。
除此之外,如果想在保留基類的屬性基礎上增加屬性,可以用super()
進行處理:
class Fish(Animal): def __init__(self, name, age, val, env): super().__init__(name, age, val) self.env_ = env
在實例化Fish
類時,需要多傳入一個生活環(huán)境env參數(shù):
f = Fish('小鯉', 2, 57, '水里') print(f.env_) # 水里
mro
mro
的含義為方法解析順序
,在類的繼承中,明白解析順序是尤為重要的,對于上述幾個類可以簡單看下mro的順序情況。
Animal.mro() # [__main__.Animal, object] Monkey.mro() # [__main__.Monkey, __main__.Animal, object] Cat.mro() # [__main__.Cat, __main__.Animal, object] Fish.mro() # [__main__.Fish, __main__.Animal, object]
mro的解析順序是從左至右,越在左邊優(yōu)先級越高,可以看到最先解析的是當前類本身,再是繼承的上一個類,最后是原生object
類。上述羅列的所有類,繼承關系都很簡單,mro的順序也簡單明了。
總結
到此這篇關于Python中類的mro與繼承關系詳解的文章就介紹到這了,更多相關Python mro內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
numpy中實現(xiàn)二維數(shù)組按照某列、某行排序的方法
下面小編就為大家分享一篇numpy中實現(xiàn)二維數(shù)組按照某列、某行排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04實例解析Python的Twisted框架中Deferred對象的用法
Deferred對象在Twsited框架中用于處理回調,這對于依靠異步的Twisted來說十分重要,接下來我們就以實例解析Python的Twisted框架中Deferred對象的用法2016-05-05Python中Matplotlib的點、線形狀、顏色以及繪制散點圖
與線型圖類似的是,散點圖也是一個個點集構成的,下面這篇文章主要給大家介紹了關于Python中Matplotlib的點、線形狀、顏色以及繪制散點圖的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-04-04