Python面向?qū)ο缶幊讨惖睦^承
1、對繼承的理解
繼承(Inheritance) :代碼復(fù)用的高級抽象
- 繼承是面向?qū)ο笤O(shè)計的精髓之一
- 實現(xiàn)了以類為單位的高級抽象級別代碼復(fù)用
- 繼承是新定義類能夠幾乎完全使用原有類屬性與方法的過程

不管是基類還是派生類,只是一種繼承說法,這都是普通的Python類
也可以按子類、父類和超類劃分。
最基礎(chǔ)的類是基類,經(jīng)過一次繼承得出派生類,還可以再一次繼承,又得出一個派生類;現(xiàn)在最基礎(chǔ)的類和第一次繼承出來的派生類是父類與子類的關(guān)系,派生出來的類在最后一次派生出來的類也是父類與子類的關(guān)系,而最基本的類和最后一個派生類屬于超類和子類的關(guān)系

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

2、類繼承的構(gòu)建
類繼承的時候在定義的時候聲明繼承關(guān)系,語法結(jié)構(gòu)如下
class <派生類名>(<基類名>): # 基類名可以帶路徑:ModuleNama.BaseClassName
def __init__(self, <參數(shù)列表>):
<語句塊>
...
派生類可以直接使用基類的屬性和方法
- 基類的屬性基本等于定義在派生類中
- 派生類可以直接使用基類的類屬性、實例屬性
- 派生類可以直接使用基類的各種方法
- 使用基類的類方法和類屬性時,要用基類的類名調(diào)用
實例代碼:
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 # 對基類屬性的使用
value1 = HumanNameClass(100)
print(value1.sum_num()) # 5050 # 對基類實例方法的使用
print(value1.double_sum()) # 10100 # 對派生類實例方法的使用
Python中有兩個與繼承關(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
3、Python中最基礎(chǔ)的類
因為Python中萬物皆對象,任何一個類也是對象、Python的所有數(shù)據(jù)類型也對象;Python語言提供所有類的最基礎(chǔ)類是object。
object是Python最基礎(chǔ)類的名詞,不需要翻譯- 所有了定義時默認繼承
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所對應(yīng)的類信息 # <class 'type'>
Python對象的三個要素:
- 標識
identity:對象一旦構(gòu)建不會改變,用id()獲得,一般是內(nèi)存地址 - 類型
type:對象的類型,用type()獲得 - 值
value:分為可變mutable與不可變immutable兩種
兩個和基礎(chǔ)類有關(guān)的Python內(nèi)置功能
| 函數(shù)/關(guān)鍵字 | 描述 |
|---|---|
| id(x) | 返回x的標識。CPython 中 id() 函數(shù)用于獲取對象的內(nèi)存地址。 |
| x is y | 判斷x和y的標識是否相等,返回True或False,不判斷值 |
4、ython類的重載
重載是派生類對基類屬性或方法的在定義
- 屬性重載:派生類定義并使用了與基類相同名稱的屬性
- 方法重載:派生類定義并使用了與基類相同名稱的方法
4.1 屬性重載
屬性重載采用就近覆蓋原則,重載無需特殊標記。方法步驟
- 優(yōu)先使用派生類重定義的屬性和方法
- 然后尋找基類的屬性和方法
- 在尋找超類的屬性和方法
實例代碼:
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 # 實例屬性重載
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 方法重載
方法重載是派生類對基類方法的在定義;分為完全重載和增量重載
完全重載:派生類完全重定義與基類相同名稱的方法
直接在派生類中定義同名方法即可
示例代碼:
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
增量重載:派生類擴展定義與基類相同名稱的方法,語法結(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("這是新增的方法里面的語句")
doc1 = TestClass()
doc2 = TestClass1()
print(doc1.test_text())
print(doc2.test_text())
'''
---輸出結(jié)果---
這是基類的方法
None # 因為函數(shù)沒有返回值
這是基類的方法
這是新增的方法里面的語句
None # 因為函數(shù)沒有返回值
'''
5、類的多繼承
多繼承的構(gòu)建是在定義時聲明繼承關(guān)系,語法結(jié)構(gòu)
class <類名>(<基類名1>, <基類名2>,..., <基類名N>): # 基類名可以帶路徑:ModuleNama.BaseClassName
def __init__(self, <參數(shù)列表>):
<語句塊>
...
Python中多繼承采用深度優(yōu)先, 從左至右的方法。所謂深度優(yōu)先從左至右就是先從最左邊開始找,找到他的基類,如果基類沒有在往上面找,直到最基礎(chǔ)的object類時還沒有找到,才往右開始尋找。

所有屬性和方法的使用按照“深度優(yōu)先從左至右”的方式選取
構(gòu)造函數(shù)也參照上述原則,super()也參照上述原則
多個基類的順序是關(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é)果
對繼承概念的理解,類繼承的構(gòu)建,了解了object是Python中最基礎(chǔ)的類
類屬性的重載原則是最近覆蓋原則
類方法的重載:重新重載的話類似類屬性的重載;增量重載使用super()函數(shù)
多繼承采用的方法是深度優(yōu)先,從左至右
到此這篇關(guān)于Python面向?qū)ο缶幊讨惖睦^承的文章就介紹到這了,更多相關(guān)Python類的繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pygame Transform圖像變形的實現(xiàn)示例
pygame.transform 模塊允許您對加載、創(chuàng)建后的圖像進行一系列操作,比如調(diào)整圖像大小、旋轉(zhuǎn)圖片等操作,感興趣的可以了解一下2021-11-11
np.concatenate()函數(shù)數(shù)組序列參數(shù)的實現(xiàn)
本文主要介紹了np.concatenate()函數(shù)數(shù)組序列參數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
FP-growth算法發(fā)現(xiàn)頻繁項集——發(fā)現(xiàn)頻繁項集
常見的挖掘頻繁項集算法有兩類,一類是Apriori算法,另一類是FP-growth。Apriori通過不斷的構(gòu)造候選集、篩選候選集挖掘出頻繁項集,需要多次掃描原始數(shù)據(jù),當原始數(shù)據(jù)較大時,磁盤I/O次數(shù)太多,效率比較低下2021-06-06
pandas中concatenate和combine_first的用法詳解
本文主要介紹了pandas中concatenate和combine_first的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

