天天看點

python--抽象類,接口類

python 沒有接口這個概念

接口類,抽象類: 制定一個規範.

第一版

class Alipay:
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('使用支付寶支付了%s' % self.money)


class Jdpay:
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('使用京東支付了%s' % self.money)


a1 = Alipay(200)
a1.pay()
j1 = Jdpay(100)
j1.pay()      

結果:

使用支付寶支付了200
使用京東支付了100      

第二版  改進,讓你支付的方式一樣

class Alipay:
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('使用支付寶支付了%s' % self.money)


class Jdpay:
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('使用京東支付了%s' % self.money)


def pay(obj):
    obj.pay()


a1 = Alipay(200)
j1 = Jdpay(100)
pay(a1)  # 歸一化設計,通過調用pay函數,執行對應類下的方法,類名.方法
pay(j1)      
使用支付寶支付了200
使用京東支付了100      

第三版,制定規則,抽象類,接口類

from abc import ABCMeta, abstractmethod


class Payment(metaclass=ABCMeta):  # 抽象類(接口類):
    @abstractmethod
    def pay(self):
        pass  # 制定了一個規範


class Alipay(Payment):
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('使用支付寶支付了%s' % self.money)


class Jdpay(Payment):
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('使用京東支付了%s' % self.money)


class Wechatpay(Payment):

    def __init__(self, money):
        self.money = money

    def pay(self):
        print('使用微信支付了%s' % self.money)


def pay(obj):
    obj.pay()


w1 = Wechatpay(200)
a1 = Alipay(200)
j1 = Jdpay(100)
pay(a1)  # 歸一化設計
pay(j1)      
使用支付寶支付了200
使用京東支付了100      

下面的類都繼承了Payment類,Payment下面有個pay方法,使用了裝飾器,如果繼承了Payment類的類下面沒有pay方法,執行個體化子類的時候會報錯