1. 程式人生 > >Python全棧學習筆記day 25:抽象類和介面類、多型、鴨子型別

Python全棧學習筆記day 25:抽象類和介面類、多型、鴨子型別

一、介面類

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 這種相似,是自己寫程式碼的時候約束的,而不是通過父類約束的
優點 : 鬆耦合 每個相似的類之間都沒有影響
缺點 : 太隨意了,只能靠自覺