日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python中類的mro與繼承關(guān)系詳解_python

作者:??宿者朽命??? ? 更新時(shí)間: 2022-09-20 編程語(yǔ)言

前言

版本:

  • windows 10.0
  • python 3.8

在Python數(shù)字比較與類結(jié)構(gòu)中有簡(jiǎn)略提到類,那么什么是類呢?

在python中定義一個(gè)類很簡(jiǎn)單,使用關(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_作為類屬性,無(wú)需實(shí)例化就能使用,而__init__下的self.name_, self.age_和self.val_需要在實(shí)例化后才能使用,且這里__init__需要傳入?yún)?shù),其中self用來(lái)指代類本身,不作為傳參值。

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類可以正常使用,再寫(xiě)一個(gè)Monkey類,繼承Animal類。

class Monkey(Animal):
    pass

Monkey后面調(diào)用Animal類,繼承了其屬性及方法,也可通過(guò)實(shí)例化,查看Monkey實(shí)例的屬性。

print(Monkey.property_)  # 類屬性: 能夠思考

m = Monkey('阿黃', 15, 40)
print(m.name_)  # 阿黃
print(m.age_)  # 15
print(m.val_)  # 40

當(dāng)然也能繼承類,對(duì)其已有的方法進(jìn)行改寫(xiě),這里再定義一個(gè)Cat類。

class Cat(Animal):

    def __init__(self, name, age):
        self.name_ = '我是' + name
        self.age_ = age

Cat類繼承后對(duì)__init__進(jìn)行了改寫(xiě),修改了name_,并且刪除了val_。

print(Cat.property_)  # 類屬性:能夠思考

c = Cat('小花', 6)
print(c.name_)  # 我是小花
print(c.age_)  # 6
print(c.val_)  # 引發(fā)AttributeError報(bào)錯(cuò)

對(duì)于類屬性還是能使用,不見(jiàn)的val_再調(diào)用就會(huì)引發(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的含義為方法解析順序,在類的繼承中,明白解析順序是尤為重要的,對(duì)于上述幾個(gè)類可以簡(jiǎn)單看下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)先級(jí)越高,可以看到最先解析的是當(dāng)前類本身,再是繼承的上一個(gè)類,最后是原生object類。上述羅列的所有類,繼承關(guān)系都很簡(jiǎn)單,mro的順序也簡(jiǎn)單明了。

總結(jié)

原文鏈接:https://juejin.cn/post/7124601326914240519

欄目分類
最近更新