天天看點

Python學習:多态與鴨子類型

什麼多态:同一事物有多種形态

為何要有多态=》多态會帶來什麼樣的特性,多态性

  • 多态性指的是可以在不考慮對象具體類型的情況下而直接使用對象
  • 多态指的是一類事物有多種形态,比如動物有多種形态:貓、狗、豬
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、dog、pig都是動物,但凡是動物肯定有talk方法,于是我們可以不用考慮它們三者的具體是什麼類型的動物,而直接使用

>>> cat.talk()
喵喵喵
>>> dog.talk()
汪汪汪
>>> pig.talk()      

綜上我們得知,多态性的本質在于不同的類中定義有相同的方法名,這樣我們就可以不考慮類而統一用一種方式去使用對象,可以通過在父類引入抽象類的概念來硬性限制子類必須有某些方法名

'''
學習中遇到問題沒人解答?小編建立了一個Python學習交流群:711312441
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
import abc

# 指定metaclass屬性将類設定為抽象類,抽象類本身隻是用來限制子類的,不能被執行個體化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 該裝飾器限制子類必須定義有一個名為talk的方法
    def talk(self): # 抽象方法中無需實作具體的功能
        pass

class Cat(Animal): # 但凡繼承Animal的子類都必須遵循Animal規定的标準
    def talk(self):
        pass

cat=Cat() # 若子類中沒有一個名為talk的方法則會抛出異常TypeError,無法執行個體化      
#二者看起來都像檔案,因而就可以當檔案一樣去用,然而它們并沒有直接的關系
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