面向對象編程的多態能夠分爲多態和多態性python
官方解釋: 多個不一樣類對象能夠響應同一個方法,產生不一樣的結果編程
首先強調多態不是一種特殊的語法,而是一種狀態,特性(既多個不一樣對象能夠響應同一個方法,產生不一樣的結果 )函數
既多個對象有相同的使用方法,
spa
對於使用者而言,大大的下降了使用難度
就像USB接口系列,適配usb接口的鼠標,鍵盤,就屬於多態
code
多態指的是一類事物有多種形態,(一個抽象類有多個子類,於是多態的概念依賴於繼承)
1.序列數據類型有多種形態:字符串,列表,元組
2.動物有多種形態:人,狗,豬
上列子(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
上列子(code)--->文件的多種形態接口
# 文件有多種形態:文件、文本文件、可執行文件 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
列子三->鴨子類型實現多態
""" 要管理 雞 鴨 鵝 如何可以最方便的 管理,就是我說同一句話,他們都能理解 既它們擁有相同的方法 """ class JI: def bark(self): print("哥哥哥") def spawn(self): print("下雞蛋..") class Duck: def bark(self): print("嘎嘎嘎") def spawn(self): print("下鴨蛋") class E: def bark(self): print("餓餓餓....") def spawn(self): print("下鵝蛋..") j = JI() y = Duck() e = E() def mange(obj): obj.spawn() mange(j) mange(y) mange(e) # python中處處都有多態 a = 10 b = "10" c = [10] print(type(a)) print(type(b)) print(type(c))
上代碼---> 文件形態多態性的使用
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自己就是支持多態性的,這麼作的好處是什麼呢?
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
多態:同一種事物的多種形態,動物分爲人類,豬類(在定義角度) 多態性:一種調用方式,不一樣的執行效果(多態性)