接口类
继承有两种用途:
一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)
二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
1 # 一:这样不好,我要统一一下支付的规则. 2 3 class QQpay: 4 def pay(self,money): 5 print('使用qq支付%s元' % money) 6 7 class Alipay: 8 def pay(self,money): 9 print('使用阿里支付%s元' % money) 10 11 a = Alipay() 12 a.pay(100) 13 14 b = QQpay() 15 b.pay(200) 16 17 # 二,统一支付的规则 归一化设计,统一 pay接口 18 class QQpay: 19 def pay(self,money): 20 print('使用qq支付%s元' % money) 21 22 class Alipay: 23 def pay(self,money): 24 print('使用阿里支付%s元' % money) 25 26 def pay(obj,money): 27 obj.pay(money) 28 29 a = Alipay() 30 b = QQpay() 31 32 pay(a,100) 33 pay(b,200) 34 35 # 三,但是,来了一个野生程序员,他不知道你的约定俗成的规则,就会出问题 36 37 class QQpay: 38 def pay(self,money): 39 print('使用qq支付%s元' % money) 40 41 class Alipay: 42 def pay(self,money): 43 print('使用阿里支付%s元' % money) 44 45 class Wechatpay: 46 def fuqian(self,money): 47 print('使用微信支付%s元' % money) 48 49 def pay(obj,money): 50 obj.pay(money) 51 52 a = Alipay() 53 b = QQpay() 54 55 pay(a,100) 56 pay(b,200) 57 58 c = Wechatpay() 59 c.fuqian(300) 60 61 # 四,解决方式 62 # 定义一个父类,什么都不写,只是要求继承我的所有类有一个pay方法,这样就制定了一个规范,这就叫做接口类,后者抽象类. 63 class Payment: 64 def pay(self):pass 65 66 class QQpay(Payment): 67 def pay(self,money): 68 print('使用qq支付%s元' % money) 69 70 class Alipay(Payment): 71 def pay(self,money): 72 print('使用阿里支付%s元' % money) 73 74 class Wechatpay(Payment): 75 def fuqian(self,money): 76 print('使用微信支付%s元' % money) 77 78 79 def pay(obj,money): 80 obj.pay(money) 81 82 a = Alipay() 83 b = QQpay() 84 85 pay(a,100) 86 pay(b,200) 87 88 c = Wechatpay() 89 c.fuqian(300) 90 91 #五,他还是不知道看你这些都继承了一个类,所以你要制定一个规范,强制他执行. 92 # 创建一个规范 93 from abc import ABCMeta,abstractmethod 94 class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类 95 @abstractmethod 96 def pay(self):pass # 抽象方法 97 98 class Alipay(Payment): 99 def pay(self,money): 100 print('使用支付宝支付了%s元'%money) 101 102 class QQpay(Payment): 103 def pay(self,money): 104 print('使用qq支付了%s元'%money) 105 106 class Wechatpay(Payment): 107 # def pay(self,money): 108 # print('使用微信支付了%s元'%money) 109 def recharge(self):pass 110 111 def pay(a,money): 112 a.pay(money) 113 114 a = Alipay() 115 a.pay(100) 116 pay(a,100) # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能 117 q = QQpay() 118 q.pay(100) 119 pay(q,100) 120 w = Wechatpay() 121 pay(w,100) # 到用的时候才会报错 122 123 124 125 # 抽象类和接口类做的事情 :建立规范 126 # 制定一个类的metaclass是ABCMeta, 127 # 那么这个类就变成了一个抽象类(接口类) 128 # 这个类的主要功能就是建立一个规范 129 130 接口类示例