Python中類的mro與繼承關(guān)系詳解
前言
版本:
- windows 10.0
- python 3.8
類
在Python數(shù)字比較與類結(jié)構(gòu)中有簡略提到類,那么什么是類呢?
在python中定義一個(gè)類很簡單,使用關(guān)鍵字class就能實(shí)現(xiàn)。
class Animal:
pass如何使用它,在類結(jié)構(gòu)中稱作實(shí)例化。
animal = Animal()
這樣,就有了一個(gè)Animal的實(shí)例。
繼承
類的其中一個(gè)特性就是能夠繼承,把Animal類豐富下,將其作為基類:
class Animal:
property_ = '能夠思考'
def __init__(self, name, age, value):
self.name_ = name
self.age_ = age
self.val_ = val在這里面,property_作為類屬性,無需實(shí)例化就能使用,而__init__下的self.name_, self.age_和self.val_需要在實(shí)例化后才能使用,且這里__init__需要傳入?yún)?shù),其中self用來指代類本身,不作為傳參值。
print(Animal.property_) # 輸出:能夠思考
print(Animal.name_) # 引發(fā)AttributeError錯(cuò)誤
a = Animal('阿黑', 12, 70)
print(a.property_) # 能夠思考
print(a.name_) # 阿黑
print(a.age_) # 12
print(a.val_) # 70
復(fù)制代碼Animal類可以正常使用,再寫一個(gè)Monkey類,繼承Animal類。
class Monkey(Animal):
pass在Monkey后面調(diào)用Animal類,繼承了其屬性及方法,也可通過實(shí)例化,查看Monkey實(shí)例的屬性。
print(Monkey.property_) # 類屬性: 能夠思考
m = Monkey('阿黃', 15, 40)
print(m.name_) # 阿黃
print(m.age_) # 15
print(m.val_) # 40當(dāng)然也能繼承類,對其已有的方法進(jìn)行改寫,這里再定義一個(gè)Cat類。
class Cat(Animal):
def __init__(self, name, age):
self.name_ = '我是' + name
self.age_ = ageCat類繼承后對__init__進(jìn)行了改寫,修改了name_,并且刪除了val_。
print(Cat.property_) # 類屬性:能夠思考
c = Cat('小花', 6)
print(c.name_) # 我是小花
print(c.age_) # 6
print(c.val_) # 引發(fā)AttributeError報(bào)錯(cuò)對于類屬性還是能使用,不見的val_再調(diào)用就會引發(fā)報(bào)錯(cuò)。
除此之外,如果想在保留基類的屬性基礎(chǔ)上增加屬性,可以用super()進(jìn)行處理:
class Fish(Animal):
def __init__(self, name, age, val, env):
super().__init__(name, age, val)
self.env_ = env在實(shí)例化Fish類時(shí),需要多傳入一個(gè)生活環(huán)境env參數(shù):
f = Fish('小鯉', 2, 57, '水里')
print(f.env_) # 水里mro
mro的含義為方法解析順序,在類的繼承中,明白解析順序是尤為重要的,對于上述幾個(gè)類可以簡單看下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)先級越高,可以看到最先解析的是當(dāng)前類本身,再是繼承的上一個(gè)類,最后是原生object類。上述羅列的所有類,繼承關(guān)系都很簡單,mro的順序也簡單明了。
總結(jié)
到此這篇關(guān)于Python中類的mro與繼承關(guān)系詳解的文章就介紹到這了,更多相關(guān)Python mro內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python模擬伯努利試驗(yàn)和二項(xiàng)分布代碼實(shí)例
這篇文章主要介紹了Python模擬伯努利試驗(yàn)和二項(xiàng)分布代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Python numpy 提取矩陣的某一行或某一列的實(shí)例
下面小編就為大家分享一篇Python numpy 提取矩陣的某一行或某一列的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
pytorch masked_fill報(bào)錯(cuò)的解決
今天小編就為大家分享一篇pytorch masked_fill報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Selenium中免登錄的實(shí)現(xiàn)方法option詳解
在selenium中有很多種可以實(shí)現(xiàn)網(wǎng)站的免登錄,option就是其中的一種做法,這篇文章主要介紹了Selenium中免登錄的實(shí)現(xiàn)方法option,需要的朋友可以參考下2022-12-12
python中的正則表達(dá)式,貪婪匹配與非貪婪匹配方式
這篇文章主要介紹了python中的正則表達(dá)式,貪婪匹配與非貪婪匹配方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Python Barbershop實(shí)現(xiàn)照片換發(fā)型功能
這篇文章主要為大家介紹了一個(gè)開源項(xiàng)目(Barbershop),可以將照片中的發(fā)型更換成另一個(gè),文中實(shí)現(xiàn)過程講解詳細(xì),感興趣的可以學(xué)習(xí)一下2022-01-01

