Python全棧學習筆記day 25:抽象類和介面類、多型、鴨子型別
阿新 • • 發佈:2018-12-19
一、介面類
python中沒有介面類 : python中自帶多繼承 所以我們直接用class來實現了介面類 抽象類、介面類 : 都是面向物件的開發規範 所有的介面類和抽象類都不能例項化 介面類 : python原生不支援 抽象類 : python原生支援的
栗子:
class Alipay: ''' 支付寶支付 ''' def pay(self,money): print('支付寶支付了%s元'%money) class Applepay: ''' apple pay支付 ''' def pay(self,money): print('apple pay支付了%s元'%money) def pay(payment,money): 統一支付入口 ''' 支付函式,總體負責支付 對應支付的物件和要支付的金額 ''' payment.pay(money) p = Alipay() pay(p,200)
開發中容易出現問題:
class Alipay: ''' 支付寶支付 ''' def pay(self,money): print('支付寶支付了%s元'%money) class Applepay: ''' apple pay支付 ''' def pay(self,money): print('apple pay支付了%s元'%money) class Wechatpay: def fuqian(self,money): ''' 實現了pay的功能,但是名字不一樣 ''' print('微信支付了%s元'%money) def pay(payment,money): ''' 支付函式,總體負責支付 對應支付的物件和要支付的金額 ''' payment.pay(money) p = Wechatpay() pay(p,200) #執行會報錯
借用abc模組來實現介面,規範! 記住格式!
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Wechatpay(Payment):
def fuqian(self,money):
print('微信支付了%s元'%money)
p = Wechatpay() 不呼叫就不會報錯了
使用abc模組後的父類,再被繼承的話,一樣的程式碼也是要再子類中在打一遍,因為使用abc模組後的父類只是一個規定了,繼承這個父類的子類,必須按照使用abc模組後的父類中的格式。
二、抽象類
抽象類 : 規範 一般情況下 單繼承 能實現的功能都是一樣的,所以在父類中可以有一些簡單的基礎實現 多繼承的情況 由於功能比較複雜,所以不容易抽象出相同的功能的具體實現寫在父類中 python中支援抽象類 : 一般情況下 單繼承 不能例項化
筆者其實感覺吧:抽象類和介面類都是規範,差不多
三、多型
python 天生支援多型 多型:不同的子類物件呼叫相同的父類方法,產生不同的執行結果。多型可以增加程式碼的靈活度
四、鴨子型別
鴨子型別:兩個類剛好相似,並不產生父類的子類的兄弟關係
栗子: list tuple 這種相似,是自己寫程式碼的時候約束的,而不是通過父類約束的
優點 : 鬆耦合 每個相似的類之間都沒有影響 缺點 : 太隨意了,只能靠自覺