您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么理解Python類的繼承”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么理解Python類的繼承”吧!
繼承(Inheritance
) :代碼復(fù)用的高級(jí)抽象
繼承是面向?qū)ο笤O(shè)計(jì)的精髓之一
實(shí)現(xiàn)了以類為單位的高級(jí)抽象級(jí)別代碼復(fù)用
繼承是新定義類能夠幾乎完全使用原有類屬性與方法的過程
不管是基類還是派生類,只是一種繼承說法,這都是普通的Python
類
也可以按子類、父類和超類劃分。
最基礎(chǔ)的類是基類,經(jīng)過一次繼承得出派生類,還可以再一次繼承,又得出一個(gè)派生類;現(xiàn)在最基礎(chǔ)的類和第一次繼承出來的派生類是父類與子類的關(guān)系,派生出來的類在最后一次派生出來的類也是父類與子類的關(guān)系,而最基本的類和最后一個(gè)派生類屬于超類和子類的關(guān)系
派生類不僅可以繼承一個(gè)基類,也可以繼承多個(gè)基類,這就是所說的多繼承的概念
類繼承的時(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ù)
接上面的代碼,
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
因?yàn)?code>Python中萬物皆對(duì)象,任何一個(gè)類也是對(duì)象、Python
的所有數(shù)據(jù)類型也對(duì)象;Python
語(yǔ)言提供所有類的最基礎(chǔ)類是object
。
object
是Python
最基礎(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,不判斷值 |
重載是派生類對(duì)基類屬性或方法的在定義
屬性重載:派生類定義并使用了與基類相同名稱的屬性
方法重載:派生類定義并使用了與基類相同名稱的方法
屬性重載采用就近覆蓋原則,重載無需特殊標(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
方法重載是派生類對(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ù)沒有返回值 '''
多繼承的構(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í)還沒有找到,才往右開始尋找。
所有屬性和方法的使用按照“深度優(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)建,了解了object
是Python
中最基礎(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)注!
免責(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)容。