溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么理解Python類的繼承

發(fā)布時(shí)間:2021-11-01 15:32:50 來源:億速云 閱讀:155 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“怎么理解Python類的繼承”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么理解Python類的繼承”吧!

    1、對(duì)繼承的理解

    繼承(Inheritance) :代碼復(fù)用的高級(jí)抽象

    • 繼承是面向?qū)ο笤O(shè)計(jì)的精髓之一

    • 實(shí)現(xiàn)了以類為單位的高級(jí)抽象級(jí)別代碼復(fù)用

    • 繼承是新定義類能夠幾乎完全使用原有類屬性與方法的過程

    怎么理解Python類的繼承

    不管是基類還是派生類,只是一種繼承說法,這都是普通的Python

    也可以按子類、父類和超類劃分。

    最基礎(chǔ)的類是基類,經(jīng)過一次繼承得出派生類,還可以再一次繼承,又得出一個(gè)派生類;現(xiàn)在最基礎(chǔ)的類和第一次繼承出來的派生類是父類與子類的關(guān)系,派生出來的類在最后一次派生出來的類也是父類與子類的關(guān)系,而最基本的類和最后一個(gè)派生類屬于超類和子類的關(guān)系

    怎么理解Python類的繼承

    派生類不僅可以繼承一個(gè)基類,也可以繼承多個(gè)基類,這就是所說的多繼承的概念

    怎么理解Python類的繼承

    2、類繼承的構(gòu)建

    類繼承的時(shí)候在定義的時(shí)候聲明繼承關(guān)系,語(yǔ)法結(jié)構(gòu)如下

    class <派生類名>(<基類名>):  # 基類名可以帶路徑:ModuleNama.BaseClassName
        def __init__(self, <參數(shù)列表>):
            <語(yǔ)句塊>
        ...

    派生類可以直接使用基類的屬性和方法

    • 基類的屬性基本等于定義在派生類中

    • 派生類可以直接使用基類的類屬性、實(shí)例屬性

    • 派生類可以直接使用基類的各種方法

    • 使用基類的類方法和類屬性時(shí),要用基類的類名調(diào)用

    實(shí)例代碼:

    class TestClass:
        def __init__(self, number):
            self.sum_number = 0
            for i in range(number + 1):
                self.sum_number += i
    
        def sum_num(self):
            return self.sum_number
    
    
    class HumanNameClass(TestClass):
        def double_sum(self):
            return self.sum_number * 2  # 對(duì)基類屬性的使用
    
    
    value1 = HumanNameClass(100)
    print(value1.sum_num())  # 5050  # 對(duì)基類實(shí)例方法的使用
    print(value1.double_sum())  # 10100  # 對(duì)派生類實(shí)例方法的使用

    Python中有兩個(gè)與繼承關(guān)系判斷有關(guān)的函數(shù)

    怎么理解Python類的繼承

    接上面的代碼,

    print(isinstance(value1, TestClass))  # True
    print(isinstance(value1, HumanNameClass))  # True
    print(isinstance(value1, int))  # False
    print(issubclass(HumanNameClass, TestClass))  # True
    print(issubclass(TestClass, HumanNameClass))  # False

    3、Python中最基礎(chǔ)的類

    因?yàn)?code>Python中萬物皆對(duì)象,任何一個(gè)類也是對(duì)象、Python的所有數(shù)據(jù)類型也對(duì)象;Python語(yǔ)言提供所有類的最基礎(chǔ)類是object

    • objectPython最基礎(chǔ)類的名詞,不需要翻譯

    • 所有了定義時(shí)默認(rèn)繼承object

    • 保留屬性和保留方法本質(zhì)上是object類的屬性和方法

    示例代碼:

    print(object.__name__)  # 打印object的名字  # object
    print(object.__bases__)  # 打印object所繼承的類名稱  # ()
    print(object.__doc__)  # 打印object類描述  # The most base type
    print(object.__module__)  # 打印object所在模塊的名稱  # builtins
    print(object.__class__)  # object所對(duì)應(yīng)的類信息  # <class 'type'>

    Python對(duì)象的三個(gè)要素:

    • 標(biāo)識(shí) identity對(duì)象一旦構(gòu)建不會(huì)改變,用id()獲得,一般是內(nèi)存地址

    • 類型 type對(duì)象的類型,用type()獲得

    • value分為可變mutable與不可變immutable兩種

    兩個(gè)和基礎(chǔ)類有關(guān)的Python內(nèi)置功能

    函數(shù)/關(guān)鍵字描述
    id(x)返回x的標(biāo)識(shí)。CPython 中 id() 函數(shù)用于獲取對(duì)象的內(nèi)存地址。
    x is y判斷x和y的標(biāo)識(shí)是否相等,返回True或False,不判斷值

    4、ython類的重載

    重載是派生類對(duì)基類屬性或方法的在定義

    • 屬性重載:派生類定義并使用了與基類相同名稱的屬性

    • 方法重載:派生類定義并使用了與基類相同名稱的方法

    4.1 屬性重載

    屬性重載采用就近覆蓋原則,重載無需特殊標(biāo)記。方法步驟

    • 優(yōu)先使用派生類重定義的屬性和方法

    • 然后尋找基類的屬性和方法

    • 在尋找超類的屬性和方法

    實(shí)例代碼:

    class TestClass:
        text = "這是基類的類屬性"
    
        def __init__(self, number):
            self.sum_number = 0
            for i in range(number + 1):
                self.sum_number += i
    
        def sum_num(self):
            return self.sum_number
    
    
    class HumanNameClass(TestClass):
        text = "這是派生類的類屬性"  # 類屬性重載
    
        def __init__(self, number):
            self.sum_number = 1000  # 實(shí)例屬性重載
    
        def double_sum(self):
            return self.sum_number * 2
    
    
    value1 = HumanNameClass(100)
    print(TestClass.text)  # 這是基類的類屬性
    print(value1.text)  # 這是派生類的類屬性
    print(value1.sum_num())  # 1000

    4.2 方法重載

    方法重載是派生類對(duì)基類方法的在定義;分為完全重載和增量重載

    完全重載:派生類完全重定義與基類相同名稱的方法

    直接在派生類中定義同名方法即可

    示例代碼:

    class TestClass:
        def __init__(self, number):
            self.sum_number = 0
            for i in range(number + 1):
                self.sum_number += i
    
        def sum_num(self):
            return self.sum_number
    
    
    class HumanNameClass(TestClass):
    
        def sum_num(self):  # 方法的重建
            return self.sum_number * 2
    
    
    value1 = HumanNameClass(100)
    print(value1.sum_num())  # 10100

    增量重載:派生類擴(kuò)展定義與基類相同名稱的方法,語(yǔ)法結(jié)構(gòu)

    class <派生類名>(<基類名>):
        def <方法名>(self, <參數(shù)列表>):
            super().<基類方法名>(<參數(shù)列表>)
            ...

    增量重載使用super()函數(shù)

    示例代碼:

    class TestClass:
        def test_text(self):
            print("這是基類的方法")
    
    
    class TestClass1(TestClass):
        def test_text(self):  # 增量重載
            super().test_text()
            print("這是新增的方法里面的語(yǔ)句")
    
    
    doc1 = TestClass()
    doc2 = TestClass1()
    print(doc1.test_text())
    print(doc2.test_text())
    '''
    ---輸出結(jié)果---
    這是基類的方法
    None   # 因?yàn)楹瘮?shù)沒有返回值
    這是基類的方法
    這是新增的方法里面的語(yǔ)句
    None  # 因?yàn)楹瘮?shù)沒有返回值
    
    '''

    5、類的多繼承

    多繼承的構(gòu)建是在定義時(shí)聲明繼承關(guān)系,語(yǔ)法結(jié)構(gòu)

    class <類名>(<基類名1>, <基類名2>,..., <基類名N>):  # 基類名可以帶路徑:ModuleNama.BaseClassName
        def __init__(self, <參數(shù)列表>):
            <語(yǔ)句塊>
        ...

    Python中多繼承采用深度優(yōu)先, 從左至右的方法。所謂深度優(yōu)先從左至右就是先從最左邊開始找,找到他的基類,如果基類沒有在往上面找,直到最基礎(chǔ)的object類時(shí)還沒有找到,才往右開始尋找。

    怎么理解Python類的繼承

    所有屬性和方法的使用按照“深度優(yōu)先從左至右”的方式選取

    構(gòu)造函數(shù)也參照上述原則,super()也參照上述原則

    多個(gè)基類的順序是關(guān)鍵

    示例代碼:

    class Test1:
        def test(self):
            text = "這是基類1"
            return text
    
    
    class Test2:
        def test(self):
            text = "這是基類2"
            return text
    
    
    class Test3(Test1, Test2):
        pass
    
    
    class Test4(Test2, Test1):
        pass
    
    
    value1 = Test3()
    value2 = Test4()
    print(value1.test())  # 這是基類1
    print(value2.test())  # 這是基類2

    循序決定輸出的結(jié)果

    對(duì)繼承概念的理解,類繼承的構(gòu)建,了解了objectPython中最基礎(chǔ)的類

    類屬性的重載原則是最近覆蓋原則

    類方法的重載:重新重載的話類似類屬性的重載;增量重載使用super()函數(shù)

    多繼承采用的方法是深度優(yōu)先,從左至右

    感謝各位的閱讀,以上就是“怎么理解Python類的繼承”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么理解Python類的繼承這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI