轉自:https://www.cnblogs.com/luchuangao/p/6739557.html 解釋的很深刻
很多人喜歡將多態與多態性二者混為一談,然后百思不得其解,其實只要分開看,就會很明朗。
一 多態:
多態指的是一類事物有多種形態,(一個抽象類有多個子類,因而多態的概念依賴於繼承)
- 序列類型有多種形態:字符串,列表,元組
- 動物有多種形態:人,狗,豬
#多態:同一種事物的多種形態,動物分為人類,豬類(在定義角度) class Animal: def run(self): raise AttributeError('子類必須實現這個方法') class People(Animal): def run(self): print('人正在走') class Pig(Animal): def run(self): print('pig is walking') class Dog(Animal): def run(self): print('dog is running') peo1=People() pig1=Pig() d1=Dog() peo1.run() pig1.run() d1.run()
import abc class Animal(metaclass=abc.ABCMeta): #同一類事物:動物 @abc.abstractmethod def talk(self): pass class People(Animal): #動物的形態之一:人 def talk(self): print('say hello') class Dog(Animal): #動物的形態之二:狗 def talk(self): print('say wangwang') class Pig(Animal): #動物的形態之三:豬 def talk(self): print('say aoao')
文件有多種形態:文件、文本文件、可執行文件
import abc class File(metaclass=abc.ABCMeta): #同一類事物:文件 @abc.abstractmethod def click(self): pass class Text(File): #文件的形態之一:文本文件 def click(self): print('open file') class ExeFile(File): #文件的形態之二:可執行文件 def click(self): print('execute file')
二 多態性
(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)
1、
2、
>>> def func(animal): #參數animal就是對態性的體現 ... animal.talk() ... >>> people1=People() #產生一個人的對象 >>> pig1=Pig() #產生一個豬的對象 >>> dog1=Dog() #產生一個狗的對象 >>> func(people1) say hello >>> func(pig1) say aoao >>> func(dog1) say wangwang
3、
>>> def func(f): ... f.click() ... >>> t1=Text() >>> e1=ExeFile() >>> func(t1) open file >>> func(e1) execute file
綜上可以說,多態性是一個接口(函數func),多種實現(如f.click())
二、為什么要用多態性(多態性的好處)
其實大家從上面多態性的例子可以看出,我們並沒有增加上面新的知識,也就是說Python本身就是支持多態性的,這么做的好處是什么呢?
(1)增加了程序的靈活性
以不變應萬變,不論對象千變萬化,使用者都是同一種形式去調用,如func(animal)
(2)增加了程序額可擴展性
通過繼承animal類創建了一個新的類,使用者無需更改自己的代碼,還是用func(animal)去調用
>>> class Cat(Animal): #屬於動物的另外一種形態:貓 ... def talk(self): ... print('say miao') ... >>> def func(animal): #對於使用者來說,自己的代碼根本無需改動 ... animal.talk() ... >>> cat1=Cat() #實例出一只貓 >>> func(cat1) #甚至連調用方式也無需改變,就能調用貓的talk功能 say miao ''' 這樣我們新增了一個形態Cat,由Cat類產生的實例cat1,使用者可以在完全不需要修改自己代碼的情況下。使用和人、狗、豬一樣的方式調用cat1的talk方法,即func(cat1) '''
注:
多態:同一種事物的多種形態,動物分為人類,豬類(在定義角度) 多態性:一種調用方式,不同的執行效果(多態性)