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('哼哼哼')
二、多態能帶來什么樣的特性?
多態性的好處在於增強了程序的靈活性和可擴展性,比如通過繼承Animal類創建了一個新的類,實例化得到的對象obj,可以使用相同的方式使用obj.talk()
class Wolf(Animal): #動物的另外一種形態:狼
def talk(self):
print('嗷...')
wolf=Wolf() # 實例出一頭狼
wolf.talk() # 使用者根本無需關心wolf是什么類型而調用talk
三、多態的本質是什么?
多態性的本質:在於不同的類中定義有相同的方法名,這樣我們就可以不考慮類而統一用一種方式去使用對象,可以通過在父類引入抽象類的概念來硬性限制子類必須有某些方法名
綜上我們得知,多態性的本質在於不同的類中定義有相同的方法名,這樣我們就可以不考慮類而統一用一種方式去使用對象,可以通過在父類引入抽象類的概念來硬性限制子類必須有某些方法名
-
指定metaclass屬性將類設置為抽象類,抽象類本身只是用來約束子類的,不能被實例化
-
該裝飾器限制子類必須定義有一個名為talk的方法
-
但凡繼承Animal的子類都必須遵循Animal規定的標准
-
若子類中沒有一個名為talk的方法則會拋出異常TypeError,無法實例化
-
還不能實例化父類
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,無法實例化
四、python如何實現多態?(python推行鴨子方法,不推線接口)
python不是通過繼承父類的方法來實現多態的!
用鴨子類型:(把他們做得長得像就可以了哈哈哈)
#二者看起來都像文件,因而就可以當文件一樣去用,然而它們並沒有直接的關系
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
obj1 = Txt()
obj2 = Disk()