【目錄】
一、多型和多型性
二、鴨子型別
一、多型和多型性
1、什么是多型
多型指的是一類事物有多種形態,比如動物有多種形態:貓、狗、豬
class Animal: #同一類事物:動物 def talk(self): pass class Cat(Animal): #動物的形態之一:貓 def talk(self): print('喵喵喵') class Dog(Animal): #動物的形態之二:狗 def talk(self): print('汪汪汪') class Pig(Animal): #動物的形態之三:豬 def talk(self): print('哼哼哼') #實體化得到三個物件 cat=Cat() dog=Dog() pig=Pig()
2、多型性
多型性指的是可以在不用考慮物件具體型別的情況下而直接使用物件,這就需要在設計時,把物件的使用方法統一成一種,
例如cat、dog、pig都是動物,但凡是動物肯定有talk方法,于是我們可以不用考慮它們三者的具體是什么型別的動物,而直接使用,
class Animal: #同一類事物:動物 def talk(self): pass class Cat(Animal): #動物的形態之一:貓 def talk(self): print('喵喵喵') class Dog(Animal): #動物的形態之二:狗 def talk(self): print('汪汪汪') class Pig(Animal): #動物的形態之三:豬 def talk(self): print('哼哼哼') #實體化得到三個物件 cat=Cat() dog=Dog() pig=Pig() cat.talk() # 喵喵喵 dog.talk() # 汪汪汪 pig.talk() # 哼哼哼
更進一步,我們可以定義一個統一的介面來使用
class Animal: #同一類事物:動物 def talk(self): pass class Cat(Animal): #動物的形態之一:貓 def talk(self): print('喵喵喵') class Dog(Animal): #動物的形態之二:狗 def talk(self): print('汪汪汪') class Pig(Animal): #動物的形態之三:豬 def talk(self): print('哼哼哼') #實體化得到三個物件 cat=Cat() dog=Dog() pig=Pig() def Talk(animal): animal.talk() Talk(cat) # 喵喵喵 Talk(dog) # 汪汪汪 Talk(pig) # 哼哼哼
python中一切皆物件,本身就支持多型性,
多型性的好處在于增強了程式的靈活性和可擴展性,比如通過繼承animal類創建了一個新的類,實體化得到的物件obj,可以使用相同的方式使用obj.talk()
class Animal: #同一類事物:動物 def talk(self): pass class Wolf(Animal): #動物的另外一種形態:狼 def talk(self): print('嗷...') wolf=Wolf() # 實體出一頭狼 wolf.talk() # 使用者根本無需關心wolf是什么型別而呼叫talk
二、鴨子型別
多型性的本質在于不同的類中定義有相同的方法名,
這樣我們就可以不考慮類而統一用一種方式去使用物件,可以通過在父類引入抽象類的概念來硬性限制子類必須有某些方法名,
import abc # 指定metaclass屬性將類設定為抽象類,抽象類本身只是用來約束子類的,不能被實體化 class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod # 該裝飾器限制子類必須定義有一個名為talk的方法 def talk(self): # 抽象方法中無需實作具體的功能 pass class Cat(Animal): # 但凡繼承Animal的子類都必須遵循Animal規定的標準 def talk(self):# 若子類中沒有一個名為talk的方法則會拋出例外TypeError,無法實體化 # TypeError: Can't instantiate abstract class Cat with abstract methods talk pass cat=Cat()
但其實我們完全可以不依賴于繼承,只需要制造出外觀和行為相同物件,同樣可以實作不考慮物件型別而使用物件,
這正是python崇尚的“鴨子型別”(duck typing):“如果看起來像、叫聲像而且走起路來像鴨子,那么它就是鴨子”,
比起繼承的方式,鴨子型別在某種程度上實作了程式的松耦合度,如下:
#二者看起來都像檔案,因而就可以當檔案一樣去用,然而它們并沒有直接的關系 class Txt: #Txt類有兩個與檔案型別同名的方法,即read和write def read(self): pass def write(self): pass class Disk: #Disk類也有兩個與檔案型別同名的方法:read和write def read(self): pass def write(self): pass
參考:
https://zhuanlan.zhihu.com/p/109334326
https://www.cnblogs.com/linhaifeng/articles/7340687.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159114.html
標籤:Python
