目錄python
不少人喜歡將多態與多態性兩者混爲一談,而後百思不得其解,其實只要分開看,就會很明朗。函數
多態指的是一類事物有多種形態,(一個抽象類有多個子類,於是多態的概念依賴於繼承)spa
序列數據類型有多種形態:字符串,列表,元組code
動物有多種形態:人,狗,豬對象
# 動物有多種形態:人類、豬、狗 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()
人正在走 pig is walking dog is running
import abc class Animal(metaclass=abc.ABCMeta): # 同一類事物:動物 @abc.abstractmethod # 上述代碼子類是約定俗稱的實現這個方法,加上@abc.abstractmethod裝飾器後嚴格控制子類必須實現這個方法 def talk(self): raise AttributeError('子類必須實現這個方法') 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') peo2 = People() pig2 = Pig() d2 = Dog() peo2.talk() pig2.talk() d2.talk()
say hello say aoao say wangwang
# 文件有多種形態:文件、文本文件、可執行文件 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') text = Text() exe_file = ExeFile() text.click() exe_file.click()
open file execute file
注意:多態與多態性是兩種概念繼承
多態性是指具備不一樣功能的函數可使用相同的函數名,這樣就能夠用一個函數名調用不一樣內容的函數。在面向對象方法中通常是這樣表述多態性:向不一樣的對象發送同一條消息,不一樣的對象在接收時會產生不一樣的行爲(即方法)。也就是說,每一個對象能夠用本身的方式去響應共同的消息。所謂消息,就是調用函數,不一樣的行爲就是指不一樣的實現,即執行不一樣的函數。接口
# 多態性:一種調用方式,不一樣的執行效果(多態性) def func(obj): obj.run() func(peo1) func(pig1) func(d1)
人正在走 pig is walking dog is running
# 多態性依賴於:繼承 # 多態性:定義統一的接口 def func(obj): # obj這個參數沒有類型限制,能夠傳入不一樣類型的值 obj.talk() # 調用的邏輯都同樣,執行的結果卻不同 func(peo2) func(pig2) func(d2)
say hello say aoao say wangwang
def func(obj): obj.click() func(text) func(exe_file)
open file execute file
def func(obj): print(len(obj)) func('hello') func([1, 2, 3]) func((1, 2, 3))
5 3 3
綜上能夠說,多態性是一個接口(函數func)的多種實現(如obj.run(),obj.talk(),obj.click(),len(obj))字符串
其實你們從上面多態性的例子能夠看出,咱們並無增長新的知識,也就是說Python自己就是支持多態性的,這麼作的好處是什麼呢?it
增長了程序的靈活性:以不變應萬變,不論對象變幻無窮,使用者都是同一種形式去調用,如func(animal)class
增長了程序額可擴展性:經過繼承Animal類建立了一個新的類,使用者無需更改本身的代碼,仍是用func(animal)去調用
class Cat(Animal): # 屬於動物的另一種形態:貓 def talk(self): print('say miao') def func(animal): # 對於使用者來講,本身的代碼根本無需改動 animal.talk() cat1 = Cat() # 實例出一隻貓 func(cat1) # 甚至連調用方式也無需改變,就能調用貓的talk功能
say miao
多態:同一種事物的多種形態,動物分爲人類,豬類(在定義角度)多態性:一種調用方式,不一樣的執行效果(多態性)