Python物件導向之繼承與多態性
本篇文章給大家分享的內容是關於Python物件導向之繼承和多態,有著一定的參考價值,有需要的朋友可以參考一下
在OOP程式設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類別(Subclass),而被繼承的class稱之為基底類別、父類別或超類別(Base class、Supper class)。
例如,我們已經寫了一個名為Animal的class,有個run()方法可以直接列印:
class Animal(object): def run(self): print('Animal is running...')
當我們需要寫Dog和Cat類別時,就可以直接從Animal類別繼承:
class Dog(Animal): pass class Cat(Animal): pass
對Dog來說,Animal就是它的父類,對Animal來說,Dog就是它的子類別。 Cat和Dog類似。
繼承有什麼好處呢?最大的好處就是子類別獲得了父類別的全部功能。由於Animal實現了run()方法,因此,Dog和Cat作為它的子類,什麼事也沒幹,就自動擁有了run()方法:
dog = Dog() dog.run() cat = Cat() cat.run()
Animal is running... Animal is running...
當然,也可以對子類增加一些方法,比如Dog類。
繼承的第二個好處需要我們對程式碼做一點改進。你看到了,無論是Dog還是Cat,它們run()的時候,顯示的都是Animal is running...,符合邏輯的做法是分別顯示Dog is running...和Cat is running... ,因此,對Dog和Cat類別改進如下:
class Animal(object): def run(self): print('Animal is running...')class Dog(Animal): def run(self): print('Dog is haha running...') def eat(self): print('Eating meat...') class Cat(Animal): def run(self): print('Cat is miaomiao running...') def eat(self): print('Eating fish...')dog = Dog() dog.run() dog.eat() cat = Cat() cat.run() cat.eat()
再次运行,结果如下:
Dog is haha running... Eating meat... Cat is miaomiao running... Eating fish...
當子類別和父類別都存在相同的run()方法時,我們說,子類別的run()覆蓋了父類別的run (),在程式碼運行的時候,總是會呼叫子類別的run()。這樣,我們就獲得了繼承的另一個好處:多型態。
要理解什麼是多態,我們要先對資料型別再作一點說明。當我們定義一個class的時候,我們其實就定義了一種資料型別。我們定義的資料類型和Python自帶的資料類型,例如str、list、dict沒什麼兩樣:
a = list()#a是list类型#a是list类型 b = Animal() #b是Animal类型 c = Dog #c是Dog类型
判斷一個變數是否是某個類型可以用isinstance()判斷:
>>> isinstance(a, list) True >>> isinstance(b, Animal) True >>> isinstance(c, Dog) True
看來a,b,c確實對應著list、Animal、Dog這3種類型。
但等等,試試看:
>>> isinstance(c, Animal) True
看來c不只是Dog,c還是Animal!
不過仔細想想,這是有道理的,因為Dog是從Animal繼承下來的,當我們創建了一個Dog的實例c時,我們認為c的資料型別是Dog沒錯。但c同時也是Animal也沒錯,Dog本來就是Animal的一種!
所以,在繼承關係中,如果一個實例的資料型別是某個子類,那麼它的資料型別也可以被看做父類。但是,反過來就不行:
>>> b = Animal() >>> isinstance(b, Dog) False
Dog可以看成Animal,但Animal不可以看成Dog。
要理解多型態的好處,我們還需要再寫一個函數,這個函數接受一個Animal型別的變數:
def run_twice(animal): animal.run() animal.run()
當我們傳入Animal的實例時,run_twice()就列印出:
>>> run_twice(Animal()) Animal is running... Animal is running...
當我們傳入Dog的實例時,run_twice()就列印出:
>>> run_twice(Dog()) Dog is running... Dog is running...
看上去沒啥意思,但是仔細想想,如果我們再定義一個pig類型,也從Animal派生:
class Pig(Animal): def run(self): print('Pig is running slowly...')
當我們呼叫run_twice(pig())
>>> run_twice(Pig()) Pig is running slowly... Pig is running slowly...
多態的好處就是,當我們需要傳入Dog、Cat、Pig時,我們只需要接收Animal類型就可以了,因為Dog、Cat、Pig都是Animal類型,然後,按照Animal類型進行操作即可。由於Animal類型有run()方法,因此,傳入的任意類型,只要是Animal類別或子類,就會自動呼叫實際類型的run()方法,這是多態的意思:
對於一個變量,我們只需要知道它是Animal類型,無需確切地知道它的子類型,就可以放心地調用run()方法,而具體調用run()方法是作用在Animal、Dog、cat、還是Pig物件上的,由運行時該物件的確切類型決定,這就是多態真正的威力:調用方只管調用,不管細節,而當我們新增一種Animal的子類別時,只要確保run()方法編寫正確,不用管原來的程式碼是如何呼叫的。這就是著名的「開閉」原則:
對修改封閉:不需要修改依賴Animal類型的run_twice()等函數。
繼承還可以一級一級繼承下來。而任何類,最終都可以追溯到根類object,這些繼承關係看起來就像一顆倒著的樹:
相關推薦:
以上是Python物件導向之繼承與多態性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

在CentOS系統上啟用PyTorchGPU加速,需要安裝CUDA、cuDNN以及PyTorch的GPU版本。以下步驟將引導您完成這一過程:CUDA和cuDNN安裝確定CUDA版本兼容性:使用nvidia-smi命令查看您的NVIDIA顯卡支持的CUDA版本。例如,您的MX450顯卡可能支持CUDA11.1或更高版本。下載並安裝CUDAToolkit:訪問NVIDIACUDAToolkit官網,根據您顯卡支持的最高CUDA版本下載並安裝相應的版本。安裝cuDNN庫:前

Docker利用Linux內核特性,提供高效、隔離的應用運行環境。其工作原理如下:1. 鏡像作為只讀模板,包含運行應用所需的一切;2. 聯合文件系統(UnionFS)層疊多個文件系統,只存儲差異部分,節省空間並加快速度;3. 守護進程管理鏡像和容器,客戶端用於交互;4. Namespaces和cgroups實現容器隔離和資源限制;5. 多種網絡模式支持容器互聯。理解這些核心概念,才能更好地利用Docker。

MinIO對象存儲:CentOS系統下的高性能部署MinIO是一款基於Go語言開發的高性能、分佈式對象存儲系統,與AmazonS3兼容。它支持多種客戶端語言,包括Java、Python、JavaScript和Go。本文將簡要介紹MinIO在CentOS系統上的安裝和兼容性。 CentOS版本兼容性MinIO已在多個CentOS版本上得到驗證,包括但不限於:CentOS7.9:提供完整的安裝指南,涵蓋集群配置、環境準備、配置文件設置、磁盤分區以及MinI

在CentOS系統上進行PyTorch分佈式訓練,需要按照以下步驟操作:PyTorch安裝:前提是CentOS系統已安裝Python和pip。根據您的CUDA版本,從PyTorch官網獲取合適的安裝命令。對於僅需CPU的訓練,可以使用以下命令:pipinstalltorchtorchvisiontorchaudio如需GPU支持,請確保已安裝對應版本的CUDA和cuDNN,並使用相應的PyTorch版本進行安裝。分佈式環境配置:分佈式訓練通常需要多台機器或單機多GPU。所

在CentOS系統上安裝PyTorch,需要仔細選擇合適的版本,並考慮以下幾個關鍵因素:一、系統環境兼容性:操作系統:建議使用CentOS7或更高版本。 CUDA與cuDNN:PyTorch版本與CUDA版本密切相關。例如,PyTorch1.9.0需要CUDA11.1,而PyTorch2.0.1則需要CUDA11.3。 cuDNN版本也必須與CUDA版本匹配。選擇PyTorch版本前,務必確認已安裝兼容的CUDA和cuDNN版本。 Python版本:PyTorch官方支

在CentOS上更新PyTorch到最新版本,可以按照以下步驟進行:方法一:使用pip升級pip:首先確保你的pip是最新版本,因為舊版本的pip可能無法正確安裝最新版本的PyTorch。 pipinstall--upgradepip卸載舊版本的PyTorch(如果已安裝):pipuninstalltorchtorchvisiontorchaudio安裝最新
