一、多態 多態指的是一類事物有多種形態,一個類有很多個子類,因而多態的概念是基於繼承的 序列數據類型有多種形態:字元串,列表,元組 動物有多種形態:人,狗,豬 1.動物的多種形態 # 動物有多種形態:人類、豬、狗 class Animal: def run(self): # 子類約定俗稱的必須實現這 ...
一、多態
多態指的是一類事物有多種形態,一個類有很多個子類,因而多態的概念是基於繼承的
- 序列數據類型有多種形態:字元串,列表,元組
- 動物有多種形態:人,狗,豬
1.動物的多種形態
# 動物有多種形態:人類、豬、狗
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
2.文件的多種形態
#Python學習交流QQ群:489111204
# 文件有多種形態:文件、文本文件、可執行文件
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
二、多態性
-
多態與多態性是兩種概念
-
多態性是指具有不同功能的函數可以使用相同的函數名,這樣就可以用一個函數名調用不同內容的函數。在面向對象方法中一般是這樣表述多態性:向不同的對象發送同一條消息,不同的對象在接收時會產生不同的行為(即方法)。也就是說,每個對象可以用自己的方式去響應共同的消息。所謂消息,就是調用函數,不同的行為就是指不同的實現,即執行不同的函數。
1.動物形態多態性的使用
多態性:一種調用方式,不同的執行效果(多態性)
def func(obj):
obj.run()
func(peo1)
func(pig1)
func(d1)
輸出
人正在走
pig is walking
dog is running
多態性依賴於:繼承
多態性:定義統一的介面
#Python學習交流QQ群:489111204
def func(obj): # obj這個參數沒有類型限制,可以傳入不同類型的值
obj.talk() # 調用的邏輯都一樣,執行的結果卻不一樣
func(peo2)
func(pig2)
func(d2)
輸出
say hello
say aoao
say wangwang
2. 文件形態多態性的使用
def func(obj):
obj.click()
func(text)
func(exe_file)
輸出
open file
execute file
3. 序列數據類型多態性的使用
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本身就是支持多態性的,這麼做的好處是什麼呢?
- 增加了程式的靈活性:以不變應萬變,不論對象千變萬化,使用者都是同一種形式去調用,如func(animal)
- 增加了程式額可擴展性:通過繼承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)
四、小結
多態:同一種事物的多種形態,動物分為人類,豬類(在定義角度)
多態性:一種調用方式,不同的執行效果(多態性)