接口类和抽象类

Java  面向对象编程的

设计模式  -----接口

接口类:  python原生是不支持的  

抽象类  python 原生支持的

 

例如现在有 两个支付方式WeChat 支付和alipay   

class Wechat:
    def pay(self,money):
        print ('微信支付%s' %money)


class Alipay:
    def zhifu(self,money):
        print ('支付宝支付%s' %money)

wechat = Wechat()
alipay = Alipay()

wechat.pay()

调用方法后是用支付, 每次都要使用创建不同的对象很 麻烦  现在统一接口后如下, 只需要选择不同对象

class Wechat:
    def pay(self,money):
        print ('微信支付%s' %money)


class Alipay:
    def zhifu(self,money):
        print ('支付宝支付%s' %money)


class applePay:
    def zhifu(self,money):
        print ('applepay支付%s' % money)

#统一支付接口
def pay(pay_obj,money):
    pay_obj.pay(money)

wechat = Wechat()
alipay = Alipay()
pay(wechat,100)

 

现在来了一个 新的程序员需要  写一个applepay   但是他没有用pay 方法而是使用了  zhifu这个方法

class Wechat:
    def pay(self,money):
        print ('微信支付%s' %money)


class Alipay:
    def zhifu(self,money):
        print ('支付宝支付%s' %money)

#新家的applePay
class applePay(Payment):
    def zhifu(self,money):
        print ('applepay支付%s' % money)

#统一支付接口
def pay(pay_obj,money):
    pay_obj.pay(money)

wechat = Wechat()
alipay = Alipay()
app = applePay()

 但是调用 pay(app,20) 会报错,  没有这个pay方法  使用的是 zhifu  这个方法

为了很好的解决问题使用如下的方式  创建一个父类继承Payment():  没有 这个方法的时候调用父类中的 方法 直接抛出一错误 , 很容易看出  没有这个方法   方便检查   

from abc import abstractmethod,ABCMeta      abc 这个模块为内置模块可用来更好的检测, 不用也没关系
from abc import abstractmethod,ABCMeta

class Payment(metaclass=ABCMeta):
@abstractmethod def pay(self,money): raise NotImplemented #没有实现此方法 class Wechat(Payment): def pay(self,money): print ('微信支付%s' %money) class Alipay(Payment): def zhifu(self,money): print ('支付宝支付%s' %money) class applePay(Payment): def zhifu(self,money): print ('applepay支付%s' % money) #统一支付接口 def pay(pay_obj,money): pay_obj.pay(money) wechat = Wechat() alipay = Alipay() app = applePay() pay(wechat,100) pay(app,20)

 

 修改名称后不报错了  

 

 

 

posted @ 2020-01-02 18:47  taysem  阅读(185)  评论(0编辑  收藏  举报