一文帶你瞭解python中的多型
我們都知道,Python 是弱型別語言,其最明顯的特徵是在使用變數時,無需為其指定具體的資料型別。這會導致一種情況,即同一變數
可能會被先後賦值不同的類物件,例如:
class CLanguage: def say(self): print("賦值的是 CLanguage 類的例項物件") class CPython: def say(self): print("賦值的是 CPython 類的例項物件") a = CLanguage() a.say() a = CPython() a.say()
執行結果為:
賦值的是 CLanguage 類的例項物件 賦值的是 CPython 類的例項物件
可以看到,a 可以被先後賦值為 CLanguage 類和 CPython 類的物件,但這並不是多型。類的多型特性,還要滿足以下 2 個前提條件:繼承:多型一定是發生在子類和父類之間;重寫:子類重寫了父類的方法。
下面程式是對上面程式碼的改寫:
class CLanguage: def say(self): print("呼叫的是 Clanguage 類的say方法") class CPython(CLanguage): def say(self): print("呼叫的是 CPython 類的say方法") class CLinux(CLanguage): def say(self): print("呼叫的是 CLinux 類的say方法") a = CLanguage() a.say() a = CPython() a.say() a = CLinux() a.say()
執行結果
呼叫的是 Clanguage 類的say方法 呼叫的是 CPython 類的say方法 呼叫的是 CLinux 類的say方法
可以看到,CPython 和 CLinux 都繼承自 CLanguage 類,且各自都重寫了父類的 say() 方法。從執行結果可以看出,同一變數 a 在執行同一個 say() 方法時,由於 a 實際表示不同的類例項物件,因此 a.say() 呼叫的並不是同一個類中的 say() 方法,這就是多型。
但是,僅僅學到這裡,讀者還無法領略 Python 類使用多型特性的精髓。其實,Python 在多型的基礎上,衍生出了一種更靈活的程式設計機制。
繼續對上面的程式進行改寫:
class WhoSay: def say(self,who): who.say() class CLanguage: def say(self): print("呼叫的是 Clanguage 類的say方法") class CPython(CLanguage): def say(self): print("呼叫的是 CPython 類的say方法") class CLinux(CLanguage): def say(self): print("呼叫的是 CLinux 類的say方法") a = WhoSay() #呼叫 CLanguage 類的 say() 方法 a.say(CLanguage()) #呼叫 CPython 類的 say() 方法 a.say(CPython()) #呼叫 CLinux 類的 say() 方法 a.say(CLinux())
程式執行結果為:
呼叫的是 Clanguage 類的say方法 呼叫的是 CPython 類的say方法 呼叫的是 CLinux 類的say方法
此程式中,透過給 WhoSay 類中的 say() 函式新增一個 who 引數,其內部利用傳入的 who 呼叫 say() 方法。這意味著,當呼叫
WhoSay 類中的 say() 方法時,我們傳給 who 引數的是哪個類的例項物件,它就會呼叫那個類中的 say() 方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2819/viewspace-2834223/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ? 一文帶你瞭解多檔案混淆加密加密
- 一文帶你瞭解 JS Module 的始末JS
- 一文帶你瞭解python語言命名規則!Python
- 一文帶你瞭解nginx基礎Nginx
- 一文帶你瞭解HDFS技術
- 一文帶你瞭解Java的命名規範!Java
- 一文帶你瞭解微服務架構和設計(多圖)微服務架構
- 一文帶你瞭解Java反射機制Java反射
- 【星課堂】一文帶你瞭解webSocketWeb
- 一文章帶你瞭解微服務微服務
- 一文帶你瞭解 JVM 的垃圾回收機制JVM
- 一文帶你瞭解深度學習中的各種卷積(上)深度學習卷積
- 一文帶你瞭解深度學習中的各種卷積(下)深度學習卷積
- 你真的瞭解python嗎?這篇文章帶你快速瞭解!Python
- 一文帶你瞭解內部開發者門戶
- 一文帶你瞭解執行緒池原理執行緒
- 一文帶你瞭解什麼是工控機?
- 一文帶你瞭解 Spring 的@Enablexxx 註解Spring
- 帶你一步一步瞭解Python中的ClassPython
- 瞭解多型多型
- 共享WiFi專案盈利如何?一文帶你瞭解WiFi
- 一文帶你全面瞭解網路遊戲的社交生態遊戲
- 一文帶你深入瞭解 Redis 的持久化方式及其原理Redis持久化
- 帶你瞭解webpackWeb
- 一文帶你瞭解區塊鏈中15種共識演算法區塊鏈演算法
- 帶你瞭解資料庫中JOIN的用法資料庫
- 帶你瞭解資料庫中group by的用法資料庫
- 帶你瞭解GaussDB SQL中的BOOLEAN表示式SQLBoolean
- 帶你瞭解營銷型網站的核心要素網站
- 熬夜之作:一文帶你瞭解Cat分散式監控分散式
- 一文帶你瞭解求職面試那些名詞(乾貨)求職面試
- 一文帶你瞭解 WGCLOUD 監控硬碟故障 SMARTGCCloud硬碟
- 綜述:一文帶你瞭解情感分析的方法有幾種
- 一文帶你帶你瞭解企業如何有效推進ERP系統的實施?
- 一文帶你搞清楚Python的多執行緒和多程序Python執行緒
- 一文帶您瞭解Python中最難理解的7個概念Python
- 一文帶你瞭解網路安全中的主動防禦與被動防禦!
- 帶你快速瞭解HTMLHTML