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)
修改名称后不报错了