標籤:產生 帶來 功能 直接 老師 splay 而且 訊息 pass
一 多態
多態指的是一類事物有多種形態
eg:動物有多種形態:貓,狗,豬
class Animal: #動物類 def eat(self): #吃 pass def drink(self): #喝 pass def sleep(self): #睡 passclass Cat(Animal): def jiao(self): print(‘喵喵喵‘)class Dog(Animal): def call(self): print(‘汪汪汪‘)class Pig(Animal): def han(self): print(‘哼哼哼‘)c=Cat()d=Dog()p=Pig()# 多態性:可以在不用考慮對象具體類型的前提下而直接使用對象下的方法c.drink()d.drink()p.drink()c.sleep()d.sleep()p.sleep()c.jiao()d.call()p.han()
檔案有多種形態:文字檔,可執行檔
import abcclass File(metaclass=abc.ABCMeta): #同一類事物:檔案 @abc.abstractmethod def click(self): passclass Text(File): #檔案的形態之一:文字檔 def click(self): print(‘open file‘)class ExeFile(File): #檔案的形態之二:可執行檔 def click(self): print(‘execute file‘)
二 多態性
一 什麼是多態動態綁定(在繼承的背景下使用時,又是也稱為多態性)
多態性是指在不考慮執行個體類型的情況下使用執行個體
在物件導向方法中一般是這樣表述多態性:向不同的對象發送同一條訊息(!!!obj.func():是調用了obj的方法func,又稱為向obj發送了一條訊息func),不同的對象在接收時會產生不同的行為(即方法)。也就是說,每個對象可以用自己的方式去響應共同的訊息。所謂訊息,就是調用函數,不同的行為就是指不同的實現,即執行不同的函數。比如:老師.下課鈴響了(),學生.下課鈴響了(),老師執行的是下班操作,學生執行的是放學操作,雖然二者訊息一樣,但是執行的效果不同
詳細解釋
多態性分為靜態性和動態多態性
靜態多態性:如任何類型都可以用運算子+進行運算
動態多態性:如下
c=Cat()d=Dog()p=Pig()#c,d,p都是動物,只要是動物肯定有talk方法#於是我們可以不用考慮它們三者的具體是什麼類型,而直接使用c.drink()d.drink()p.drink()#更進一步,我們可以定義一個統一的介面來使用def func(obj): obj.talk()
二 為什麼要用多態性(多態性的好處)
其實大家從上面多態性的例子可以看出,我們並沒有增加什麼新的知識,也就是說python本身就是支援多態性的,這麼做的好處是什麼呢?
1.增加了程式的靈活性
以不變應萬變,不論對象千變萬化,使用者都是同一種形式去調用,如func(animal)
2.增加了程式額可擴充性
通過繼承animal類建立了一個新的類,使用者無需更改自己的代碼,還是用func(animal)去調用
在公司研發一套程式,基本是幾個程式員合作完成的,所以需要建立一套強制要求去遵循的規則
用基類建立一套統一的規則,強制子類去遵循(使用抽象類別實現),這樣便可以在不用考略對象具體類型的前提下二直接使用對象下的方法
如何用多態
import abc #匯入abc模組來實現強制限制式子類
#子類必須有父類的方法,否則執行個體話 TypeError: Can‘t instantiate abstract class People with abstract methods eat
class Animal(metaclass=abc.ABCMeta): #動物類 @abc.abstractmethod def eat(self): #吃 pass @abc.abstractmethod def drink(self): #喝 pass @abc.abstractmethod def sleep(self): #睡 passclass Cat(Animal): def eat(self): #吃 pass def drink(self): #喝 pass def sleep(self): #睡 print(‘貓睡覺‘)class People(Animal): #新添加 屬於動物的另外一種形態:貓 def eat(self): pass def drink(self): pass def sleep(self): print(‘人睡覺‘) def func(animal): #對於使用者來說,自己的代碼根本無須改動 animal.sleep()cat1=Cat()peo1=People() #執行個體話出一個人func(peo1) #調用人的sleep功能func(cat1)
三 鴨子類型
逗比時刻:
Python崇尚鴨子類型,即‘如果看起來像、叫聲像而且走起路來像鴨子,那麼它就是鴨子’
python程式員通常根據這種行為來編寫程式。例如,如果想編寫現有對象的自訂版本,可以繼承該對象
也可以建立一個外觀和行為像,但與它無任何關係的全新對象,後者通常用於儲存程式組件的松耦合度。
例1:利用標準庫中定義的各種‘與檔案類似’的對象,儘管這些對象的工作方式像檔案,但他們沒有繼承內建檔案對象的方法
#二者都像鴨子,二者看起來都像檔案,因而就可以當檔案一樣去用class TxtFile: def read(self): pass def write(self): passclass DiskFile: def read(self): pass def write(self): pass
例2:其實大家一直在享受著多態性帶來的好處,比如Python的序列類型有多種形態:字串,列表,元組,多態性體現如下
#str,list,tuple都是序列類型s=str(‘hello‘)l=list([1,2,3])t=tuple((4,5,6))#我們可以在不考慮三者類型的前提下使用s,l,ts.__len__()l.__len__()t.__len__()len(s)len(l)len(t)
python之旅:物件導向之多態、多態性