Python---繼承

1、什么是繼承

我們接下來來聊聊Python代碼中的“繼承”:類是用來描述現實世界中同一組事務的共有特性的抽象模型,但是類也有上下級和范圍之分,比如:生物 => 動物 => 哺乳動物 => 靈長型動物 => 人類 => 黃種人

從哲學上說,就是共性與個性之間的關系,比如:白馬和馬!所以,我們在OOP代碼中,也一樣要體現出類與類之間的共性與個性關系,這里就需要通過類的繼承來體現。簡單來說,如果一個類A使用了另一個類B的成員(屬性和方法),我們就可以說A類繼承了B類,同時這也體現了OOP中代碼重用的特性!

2、繼承的基本語法

假設A類要繼承B類中的所有屬性和方法(私有屬性和私有方法除外)


class B(object):
? ? pass

clss A(B):
? ? pass

a = A()
a.B中的所有公共屬性
a.B中的所有公共方法


案例:Person類與Teacher、Student類之間的繼承關系


class Person(object):
? ? def eat(self):
? ? ? ? print('i can eat food!')

? ? def speak(self):
? ? ? ? print('i can speak!')
? ? ? ??
class Teacher(Person):
? ? pass

class Student(Person):
? ? pass

teacher = Teacher()
teacher.eat()
teacher.speak()

student = Student()
student.eat()
studnet.speak()


3、與繼承相關的幾個概念

繼承:一個類從另一個已有的類獲得其成員的相關特性,就叫作繼承!

派生:從一個已有的類產生一個新的類,稱為派生!

很顯然,繼承和派生其實就是從不同的方向來描述的相同的概念而已,本質上是一樣的!

父類:也叫作基類,就是指已有被繼承的類!

子類:也叫作派生類或擴展類

擴展:在子類中增加一些自己特有的特性,就叫作擴展,沒有擴展,繼承也就沒有意義了!

單繼承:一個類只能繼承自一個其他的類,不能繼承多個類,單繼承也是大多數面向對象語言的特性!

多繼承:一個類同時繼承了多個父類, (C++、Python等語言都支持多繼承)

4、單繼承

單繼承:一個類只能繼承自一個其他的類,不能繼承多個類。這個類會有具有父類的屬性和方法。

基本語法:


# 1、定義一個共性類(父類)
class Person(object):
? ? pass
# 2、定義一個個性類(子類)
class Teacher(Person):
? ? pass


案例:比如汽車可以分為兩種類型(汽油車、電動車)


# 1、定義一個共性類(車類)
class Car(object):
? ? def run(self):
? ? ? ? print('i can run')
# 2、定義汽油車
class GasolineCar(Car):
? ? pass
# 3、定義電動車
class EletricCar(Car):
? ? pass

bwm = GasolineCar()
bwm.run()


5、單繼承特性:傳遞性

在Python繼承中,如A類繼承了B類,B類又繼承了C類。則根據繼承的傳遞性,則A類也會自動繼承C類中所有屬性和方法(公共)


class C(object):
? ? def func(self):
? ? ? ? print('我是C類中的相關方法func')
? ? ? ??
class B(C):
? ? pass

class A(B):
? ? pass

a = A()
a.func()


6、編寫面向對象代碼中的常見問題

答:在Python中,類理論上是不區分大小寫的。但是要遵循一定的命名規范:首字母必須是字母或下劃線,其中可以包含字母、數字和下劃線,而且要求其命名方式采用大駝峰。

電動汽車:EletricCar

父類:Father

子類:Son

問題2:父類一定要繼承object么?Car(object)

答:在Python面向對象代碼中,建議在編寫父類時,讓其自動繼承object類。但是其實不寫也可以,因為默認情況下,Python中的所有類都繼承自object。

問題3:打印屬性和方法時,都喜歡用print


class Person():
? ? def __init__(self, name):
? ? ? ? self.name = name
? ? ? ??
? ? def speak(self):
? ? ? ? print('i can speak')
? ? ? ??
# 創建對象,打印屬性和方法
p = Person('Tom')
print(p.name)
p.speak()


7、多繼承

什么是多繼承?

Python語言是少數支持多繼承的一門編程語言,所謂的多繼承就是允許一個類同時繼承自多個類的特性。

基本語法:


class B(object):
? ? pass

class C(object):
? ? pass

class A(B, C):
? ? pass

a = A()
a.B中的所有屬性和方法
a.C中的所有屬性和方法


案例:汽油車、電動車 => 混合動力汽車(汽車 + 電動)


class GasolineCar(object):
? ? def run_with_gasoline(self):
? ? ? ? print('i can run with gasoline')
? ? ? ??
class EletricCar(object):
? ? def run_with_eletric(self):
? ? ? ? print('i can run with eletric')
? ? ? ??
class HybridCar(GasolineCar, EletricCar):
? ? pass

tesla = HybridCar()
tesla.run_with_gasoline()
tesla.run_with_eletric()


注意:雖然多繼承允許我們同時繼承自多個類,但是實際開發中,應盡量避免使用多繼承,因為如果兩個類中出現了相同的屬性和方法就會產生命名沖突。

8、子類擴展:重寫父類屬性和方法

擴展特性:繼承讓子類繼承父類的所有公共屬性和方法,但是如果僅僅是為了繼承公共屬性和方法,繼承就沒有實際的意義了,應該是在繼承以后,子類應該有一些自己的屬性和方法。

什么是重寫?

重寫也叫作覆蓋,就是當子類成員與父類成員名字相同的時候,從父類繼承下來的成員會重新定義!

此時,通過子類實例化出來的對象訪問相關成員的時候,真正其作用的是子類中定義的成員!

上面單繼承例子中 Animal 的子類 Cat和Dog 繼承了父類的屬性和方法,但是我們狗類Dog 有自己的叫聲'汪汪叫',貓類 Cat 有自己的叫聲 '喵喵叫' ,這時我們需要對父類的 call() 方法進行重構。如下:


class Animal(object):
? ? def eat(self):
? ? ? ? print('i can eat')
? ??
? ? def call(self):
? ? ? ? print('i can call')
? ? ? ??
class Dog(Animal):
? ? pass

class Cat(Animal):
? ? pass

wangcai = Dog()
wangcai.eat()
wangcai.call()

miaomiao = Cat()
miaomiao.eat()
miaomiao.call()


Dog、Cat子類重寫父類Animal中的call方法:


class Animal(object):
? ? def eat(self):
? ? ? ? print('i can eat')
? ? # 公共方法
? ? def call(self):
? ? ? ? print('i can call')


class Dog(Animal):
? ? # 重寫父類的call方法
? ? def call(self):
? ? ? ? print('i can wang wang wang')


class Cat(Animal):
? ? # 重寫父類的call方法
? ? def call(self):
? ? ? ? print('i can miao miao miao')


wangcai = Dog()
wangcai.eat()
wangcai.call()

miaomiao = Cat()
miaomiao.eat()
miaomiao.call()


思考:重寫父類中的call方法以后,此時父類中的call方法還在不在?

答:還在,只不過是在其子類中找不到了。類方法的調用順序,當我們在子類中重構父類的方法后,Cat子類的實例先會在自己的類 Cat 中查找該方法,當找不到該方法時才會去父類 Animal 中查找對應的方法。

9、super()調用父類屬性和方法

super():調用父類屬性或方法,完整寫法:super(當前類名, self).屬性或方法(),在Python3以后版本中,調用父類的屬性和方法我們只需要使用super().屬性或super().方法名()就可以完成調用了。

案例:Car汽車類、GasolineCar汽油車、ElectricCar電動車


class Car(object):
? ? def __init__(self, brand, model, color):
? ? ? ? self.brand = brand
? ? ? ? self.model = model
? ? ? ? self.color = color
? ? ?def run(self):
? ? ? ? print('i can run')
? ? ? ??
class GasolineCar(Car):
? ? def __init__(self, brand, model, color):
? ? ? ? super().__init__(brand, model, color)
? ? ? ??
? ? def run(self):
? ? ? ? print('i can run with gasoline')
? ? ? ??
class ElectricCar(Car):
? ? def __init__(self, brand, model, color):
? ? ? ? super().__init__(brand, model, color)
? ? ? ? # 電池屬性
? ? ? ? self.battery = 70
? ? ? ??
? ? def run(self):
? ? ? ? print(f'i can run with electric,remain:{self.battery}')
? ? ? ??
bwm = GasolineCar('寶馬', 'X5', '白色')
bwm.run()

tesla = ElectricCar('特斯拉', 'Model S', '紅色')
tesla.run()


10、MRO屬性或MRO方法:方法解析順序

MRO(Method Resolution Order):方法解析順序,我們可以通過類名.__mro__類名.mro()獲得“類的層次結構”,方法解析順序也是按照這個“類的層次結構”尋找到。


class Car(object):
? ? def __init__(self, brand, model, color):
? ? ? ? self.brand = brand
? ? ? ? self.model = model
? ? ? ? self.color = color
? ? ?def run(self):
? ? ? ? print('i can run')
? ? ? ??
class GasolineCar(Car):
? ? def __init__(self, brand, model, color):
? ? ? ? super().__init__(brand, model, color)
? ? ? ??
? ? def run(self):
? ? ? ? print('i can run with gasoline')
? ? ? ??
class ElectricCar(Car):
? ? def __init__(self, brand, model, color):
? ? ? ? super().__init__(brand, model, color)
? ? ? ? # 電池屬性
? ? ? ? self.battery = 70
? ? ? ??
? ? def run(self):
? ? ? ? print(f'i can run with electric,remain:{self.battery}')
? ? ? ??
print(ElectricCar.__mro__)
print(ElectricCar.mro())


說明:有MRO方法解析順序可知,在類的繼承中,當某個類創建了一個對象時,調用屬性或方法,首先在自身類中去尋找,如找到,則直接使用,停止后續的查找。如果未找到,繼續向上一級繼承的類中去尋找,如找到,則直接使用,沒有找到則繼續向上尋找...直到object類,這就是Python類繼承中,其方法解析順序。

綜上:object類還是所有類的基類(因為這個查找關系到object才終止)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208607.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208607.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

prometheus服務發現之consul

文章目錄 前言一、Consul 在這里的作用二、原理三、實現過程安裝 consul節點信息(exporter)注冊進去consul節點信息(exporter)從consul解除注冊:prometheus配置consul地址 總結 前言 我們平時使用 prometheus 收集監控…

接口的性能優化(從前端、后端、數據庫三個角度分析)

接口的性能優化(前端、后端、數據庫) 主要通過三方面進行優化 前端后端數據庫 前端優化 接口拆分 不要搞一個大而全的接口,要區分核心與非核心的接口,不然核心接口就會被非核心接口拖累 或者一個接口中大部分返回都很快&…

通過rc.local開機自啟執行nohup命令運行Flask,nohup.out中沒有Flask請求響應日志

需求 通過修改/etc/rc.d/rc.local,實現開機自啟Flask服務,CentOS 7.9。rc.local參考鏈接1,參考鏈接2。 問題 在/etc/rc.d/rc.local中添加 /home/python/face_jiance/kaijiziqi.sh 在/home/python/face_jiance/kaijiziqi.sh中寫 nohup /…

數據可視化軟件的興起:背后的驅動力

在當今信息時代,數據變得比以往任何時候都更為重要。數據可視化軟件的廣泛應用成為了一種趨勢。那么,為什么越來越多的人選擇使用數據可視化軟件呢?今天我就以自己的工作經驗為基礎,進行簡單的分析。 數據可視化軟件能將枯燥的數…

react-lazyload 的介紹、安裝、使用。

目錄 基本介紹 安裝 使用 基本使用 詳細屬性 基本介紹 react-lazyload 是一個 React 組件,用于延遲加載(懶加載)頁面上的圖片或其他資源。懶加載是一種優化手段,它允許頁面在初次加載時只加載可視區域內的內容,…

【Harmony】鴻蒙操作系統架構

目錄 導論 第一部分:內核與核心組件 1.1 鴻蒙微內核的設計 1.2 分布式能力的強化 1.3 HarmonyOS的分層架構 1.4 分布式數據管理 第二部分:鴻蒙的核心能力 2.1 華為 ARK Compiler的引入 2.2 分布式圖形界面的實現 2.3 統一的設備驅動框架 2.4 輕…

vue3移動端腳手架(純凈,集成豐富)

概述 一個純凈的移動端框架 ,用到了 Vue3 vuex Vite3 Vant3 sass eslint stylelint htmlhint husky commitlint axios axios-adapter VConsole 自定義全局 loading ,自定義函數式 dialog (api模仿微信小程序)&#x…

增強現實中的真實人/機/環與虛擬人/機/環

在增強現實中,真實人與虛擬人、真實機器與虛擬機器、真實環境與虛擬環境之間有著密切的關系。增強現實技術通過將真實與虛擬相結合,打破了傳統的現實世界與虛擬世界的界限,創造出了一種新的體驗方式。真實人、真實機器和真實環境與其對應的虛…

linux進入emergency mode

問題描述 linux系統進入emergency mode模式 解決方法 查看問題原因 journalctl -xb -p3 使用fsck 不一定是sda2,也可能是其他,我的是/dev/sda6,然后接受所有的option,完畢后重啟電腦 fsck /dev/sda2接受所有的選項&#xff…

Python與ArcGIS系列(十六)重復節點檢測

目錄 0 簡述1 實例需求2 arcpy開發腳本0 簡述 在處理gis線圖層和面圖層數據時,有時候會遇到這種情況:數據存在重復節點或偽重復節點(兩個節點距離極小),往往我們需要對這種數據進行檢測標注或進行修改。本篇將介紹如何利用arcpy及arcgis的工具箱實現這個功能。 1 實例需求…

Webpack技術入門與實踐

1.概念: 本質上, webpack是一個現代JavaScript應用程序的靜態模塊打包器,當webpack處理應用程序時,它會遞歸地構建一個依賴關系圖,其中包含應用程序需要的每個模塊,然后將所有這些模塊打包成一個或多個bund…

【UE 材質】任務目標點效果

效果 步驟 1. 新建一個工程,創建一個Basic關卡 2. 新建一個材質,這里命名為“M_GoalPoint” 打開“M_GoalPoint”,設置混合模式為“半透明”,勾選“雙面” 在材質圖表中添加如下節點 此時預覽效果如下 繼續添加如下節點 此時效果…

無人機巡檢中臺揭秘,無人機管控平臺助力巡查無人機巡檢方案落地

隨著無人機智能巡檢的飛速發展,巡查無人機應用場景也日益多元,無人機巡檢方案被頻繁落地到工業生產及巡檢巡邏業務中。而無人機管控平臺應運而生,成為推動無人機智能巡檢的關鍵工具。那我們一起來看一下無人機管控平臺的作用: 一、…

微信小程序引入Vant Weapp修改樣式不起作用,使用外部樣式類進行覆蓋

一、引入Vant Weapp后樣式問題 在項目中使用第三方組件修改css樣式時,總是出現各種各樣問題,修改的css樣式不起作用,沒有效果,效果不符合預期等。 栗子(引入一個搜索框組件)實現效果: 左側有一個搜索文字背景為藍色,接著跟一個搜索框 wxml <view class"container&q…

【Python】 Python web開發庫大全

庫排序是按照使用人數和文檔的活躍度為參考進行的&#xff0c;建議大家使用排名靠前的框架&#xff0c;因為它們的文檔更齊全&#xff0c;技術積累要更多&#xff0c;社區更繁盛&#xff0c;能得到更好的支持&#xff0c;這樣在遇到自己無法解決的問題&#xff0c;可以更快更高…

數據結構:單鏈表——定義、插入、刪除

1、定義 注&#xff0c;以下都是帶頭節點的單鏈表 typedef struct LNode {ElementType data;struct LNode *next; }LNode,*LinkList;bool InitList(LinkList &L){L (LNode *)malloc(sizeof(LNode));if(LNULL){//內存不足return false;}L->nextNULL;return true; }這里…

Mint Blockchain,一個聚焦在 NFT 領域的 L2 網絡

Mint 是什么&#xff1f; Mint 是一個聚焦在 NFT 領域的創新型 L2 網絡。Mint Blockchain 致力于促進 NFT 資產協議標準的創新和現實商業場景中 NFT 資產的大規模采用。 不管是過去 3 年在以太坊網絡涌現的 NFT&#xff0c;還是當下在比特幣網絡活躍的“銘文” NFT&#xff0c…

通信協議 遠程調用RPC

1.通訊協議 所有的HDFS通訊協議都是建立在TCP/IP協議之上。 客戶端通過一個可配置的TCP端口連接到Namenode&#xff0c;通過ClientProtocol協議與Namenode交 互。而Datanode使用DatanodeProtocol協議與Namenode交互。 一個遠程過程調用(RPC)模型被抽象出來封裝ClientProtoc…

微信小程序引入vant-weapp爬出坑

最新的微信小程序的項目結構跟之前的不一樣&#xff0c;然后&#xff0c;按照vant-weapp上的官方文檔&#xff0c;安裝步驟失敗&#xff0c;提示了各種錯誤。如果你的微信小程序結構跟我的一致&#xff0c;可以采用和我一樣的方案。 微信小程序引入vant-weapp爬出坑 移動pack…

深入淺出:HTTPS單向與雙向認證及證書解析20231208

介紹: 網絡安全的核心之一是了解和實施HTTPS認證。本文將探討HTTPS單向認證和雙向認證的區別&#xff0c;以及SSL證書和CA證書在這些過程中的作用&#xff0c;并通過Nginx配置實例具體說明。 第一部分&#xff1a;HTTPS單向認證 定義及工作原理&#xff1a;HTTPS單向認證是一…