標籤:多態性 secret method 底線 重寫 eth 沒有 style 可擴充
1.繼承類的繼承
物件導向的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過繼承機制。
通過繼承建立的新類稱為子類或衍生類別,被繼承的類稱為基類、父類或超類。
繼承文法
class 衍生類別名(基類名)
在python中繼承中的一些特點:
- 1、如果在子類中需要父類的構造方法就需要顯示的調用父類的構造方法,或者不重寫父類的構造方法。詳細說明可查看:python 子類繼承父類建構函式說明。
- 2、在調用基類的方法時,需要加上基類的類名首碼,且需要帶上 self 參數變數。區別在於類中調用普通函數時並不需要帶上 self 參數
- 3、Python 總是首先尋找對應類型的方法,如果它不能在衍生類別中找到對應的方法,它才開始到基類中逐個尋找。(先在本類中尋找調用的方法,找不到才去基類中找)。
如果在繼承元組中列了一個以上的類,那麼它就被稱作"多重繼承" 。
文法:
衍生類別的聲明,與他們的父類類似,繼承的基類列表跟在類名之後,如下所示
class SubClassName (ParentClass1[, ParentClass2, ...]): ...
方法重寫
如果你的父類方法的功能不能滿足你的需求,你可以在子類重寫你父類的方法:
class Parent: # 定義父類 def myMethod(self): print ‘調用父類方法‘ class Child(Parent): # 定義子類 def myMethod(self): print ‘調用子類方法‘ c = Child() # 子類執行個體c.myMethod() # 子類調用重寫方法
類的私人屬性
__private_attrs:兩個底線開頭,聲明該屬性為私人,不能在類的外部被使用或直接存取。在類內部的方法中使用時 self.__private_attrs。
類的方法
在類的內部,使用 def 關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數 self,且為第一個參數
類的私人方法
__private_method:兩個底線開頭,聲明該方法為私人方法,不能在類的外部調用。在類的內部調用 self.__private_methods
class JustCounter: __secretCount = 0 # 私人變數 publicCount = 0 # 公開變數 def count(self): self.__secretCount += 1 self.publicCount += 1 print self.__secretCount counter = JustCounter()counter.count()counter.count()print counter.publicCountprint counter.__secretCount # 報錯,執行個體不能訪問私人變數
Python不允許執行個體化的類訪問私人資料,但你可以使用 object._className__attrName( 對象名._類名__私人屬性名稱 )訪問屬性
2.多態
多態指的是一類事物有多種形態,(一個抽象類別有多個子類,因而多態的概念依賴於繼承)
(1)什麼是多態性(注意:多態與多態性是兩種概念)
多態性是指具有不同功能的函數可以使用相同的函數名,這樣就可以用一個函數名調用不同內容的函數。在物件導向方法中一般是這樣表述多態性:向不同的對象發送同一條訊息,不同的對象在接收時會產生不同的行為(即方法)。也就是說,每個對象可以用自己的方式去響應共同的訊息。所謂訊息,就是調用函數,不同的行為就是指不同的實現,即執行不同的函數。
#多態性:一種調用方式,不同的執行效果(多態性)def func(obj): obj.run() func(peo1)func(pig1)func(d1) # peo1.run()# pig1.run() # 多態性依賴於:繼承##多態性:定義統一的介面,def func(obj): #obj這個參數沒有類型限制,可以傳入不同類型的值 obj.run() #調用的邏輯都一樣,執行的結果卻不一樣 func(peo1)func(pig1) func(d1)
(2).
為什麼要用多態性(多態性的好處)
其實大家從上面多態性的例子可以看出,我們並沒有增加上面新的知識,也就是說Python本身就是支援多態性的,這麼做的好處是什麼呢?
(1)增加了程式的靈活性
以不變應萬變,不論對象千變萬化,使用者都是同一種形式去調用,如func(animal)
(2)增加了程式額可擴充性
通過繼承animal類建立了一個新的類,使用者無需更改自己的代碼,還是用func(animal)去調用
註:
多態:同一種事物的多種形態,動物分為人類,豬類(在定義角度) 多態性:一種調用方式,不同的執行效果(多態性)
多態的好處就是,當我們需要傳入Dog、Cat、Tortoise……時,我們只需要接收Animal類型就可以了,因為Dog、Cat、Tortoise……都是Animal類型,然後,按照Animal類型進行操作即可。由於Animal類型有run()方法,因此,傳入的任意類型,只要是Animal類或者子類,就會自動調用實際類型的run()方法,這就是多態的意思:
對於一個變數,我們只需要知道它是Animal類型,無需確切地知道它的子類型,就可以放心地調用run()方法,而具體調用的run()方法是作用在Animal、Dog、Cat還是Tortoise對象上,由運行時該對象的確切類型決定,這就是多態真正的威力:調用方只管調用,不管細節,而當我們新增一種Animal的子類時,只要確保run()方法編寫正確,不用管原來的代碼是如何調用的。這就是著名的“開閉”原則:
對擴充開放:允許新增Animal子類;
對修改封閉:不需要修改依賴Animal類型的run_twice()等函數。
python大法好——繼承、多態