接口类和抽象类(都是一种思想概念)python
1、简单的说明什么是接口类和抽象类编程
Java主要是面向对象编程的,比较推崇设计模式,而接口是在设计模式里面的一种思惟概念,因此接口类是Java里面原生支持的,而python中原生不支持接口类,可是因为设计模式里面有接口类这个概念,而python也会用到设计模式的思惟,因此也会接触到接口类。设计模式
接口类:python原生不支持微信
抽象类:python原生支持app
2、在代码里面实现接口类函数
定义几种支付方式,而且最后统一支付入口,代码以下:学习
class Wechatpay: def pay(self,money): print('已经使用微信支付了%s元' % money) class Alipay: def pay(self,money): print('已经使用支付宝支付了%s元' % money) # 再定义一个Applepay类 class Aapplepay: def fuqian(self,money): # 这里不是使用pay函数 print('已经使用苹果支付了%s元' % money) def pay(pay_obj,money): # 统一支付入口,无论使用哪一种方式,主要就是支付就能够了 pay_obj.pay(money) wechat = Wechatpay() # 实例化 ali = Alipay() # 实例化 app = Aapplepay() # 实例化 pay(wechat,100) # 经过微信支付100 pay(ali,200) # 经过支付宝支付200 pay(app,300) # 这里调用pay函数,可是前面Applepay里面使用的不是pay函数而是fuqian,因此这里结果将会报错
运行结果:微信支付
C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/sku1-1/PycharmProjects/untitled/学习笔记/接口类和抽象类.py 已经使用微信支付了100元 已经使用支付宝支付了200元 Traceback (most recent call last): File "<encoding error>", line 26, in <module> File "<encoding error>", line 16, in pay AttributeError: 'Aapplepay' object has no attribute 'pay'
从上面的运行结果能够知道,定义的第三种支付方式,经过统一支付入口后将没法支付,结果就会报错,改变一下报错的方式,以下代码:spa
# 再定义一个类 class Payment: def pay(self,money): raise NotImplementedError # 报没有实现这个方法的错误,因此能够知道前面错误的地方就应该存在与pay同名的方法 class Wechatpay(Payment): # 继承Payment类,可是先找本身里面是否有pay函数,有就用本身的,没有才找父类 def pay(self,money): print('已经使用微信支付了%s元' % money) class Alipay(Payment): def pay(self,money): # 继承Payment类,可是先找本身里面是否有pay函数,有就用本身的,没有才找父类 print('已经使用支付宝支付了%s元' % money) # 再定义一个Applepay类 class Aapplepay(Payment): # 继承Payment类,可是先找本身里面是否有pay函数,有就用本身的,没有才找父类,由于这里面没有pay函数, # 因此执行父类,因此最后将会报’NotImplementedError‘的错误 def fuqian(self,money): # 这里不是使用pay函数 print('已经使用苹果支付了%s元' % money) def pay(pay_obj,money): # 统一支付入口,无论使用哪一种方式,主要就是支付就能够了 pay_obj.pay(money) wechat = Wechatpay() # 实例化 ali = Alipay() # 实例化 app = Aapplepay() # 实例化 pay(wechat,100) # 经过微信支付100 pay(ali,200) # 经过支付宝支付200 pay(app,300) # 这里调用pay函数,可是前面Applepay里面使用的不是pay函数而是fuqian,因此这里结果将会报错
运行结果:设计
已经使用微信支付了100元 Traceback (most recent call last): 已经使用支付宝支付了200元 File "<encoding error>", line 33, in <module> File "<encoding error>", line 23, in pay File "<encoding error>", line 4, in pay NotImplementedError
从代码中能够看到,只要你支付方式里面不存在pay的函数方法,就会直接执行父类payment里面的pay方法,从然后面直接报本身写的错误,这样能够提示出错的支付方式里面应该存在
与父类中的pay方法同样的方法或者函数,可是这样的报错方法必需要经过调用pay方法后才能找出错误,若是要在不对pay方法进行调用的状况下就能够找到错误的地方,这样的代码改进以下:
from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): # 默认的元类type @abstractmethod def pay(self,money): pass # 只要使用了以上这样的方法就代表已经创建一个规范,规范下面全部的代码,使得如下的代码都应该存在与pay同名的方法, # 不存在就没法进行,就会报错,并且报错方法还会具体指出错误所在 class Wechatpay(Payment): # 继承Payment类,可是先找本身里面是否有pay函数,有就用本身的,没有才找父类 def pay(self,money): print('已经使用微信支付了%s元' % money) class Alipay(Payment): def pay(self,money): # 继承Payment类,可是先找本身里面是否有pay函数,有就用本身的,没有才找父类 print('已经使用支付宝支付了%s元' % money) # 再定义一个Applepay类 class Aapplepay(Payment): # 继承Payment类,可是先找本身里面是否有pay函数,有就用本身的,没有才找父类,由于这里面没有pay函数, # 因此执行父类,因此最后将会报’NotImplementedError‘的错误 def fuqian(self,money): # 这里不是使用pay函数 print('已经使用苹果支付了%s元' % money) def pay(pay_obj,money): # 统一支付入口,无论使用哪一种方式,主要就是支付就能够了 pay_obj.pay(money) wechat = Wechatpay() # 实例化 ali = Alipay() # 实例化 app = Aapplepay() # 实例化 # 使用了开头的规范后,就不须要在进行调用方法pay才能够报错了了,直接进行实例化就能够, # 这样方便写代码的人很快就能够找出错误所在 # pay(wechat,100) # 经过微信支付100 # pay(ali,200) # 经过支付宝支付200 # pay(app,300) # 这里调用pay函数,可是前面Applepay里面使用的不是pay函数而是fuqian,因此这里结果将会报错
运行结果:
Traceback (most recent call last): File "<encoding error>", line 32, in <module> TypeError: Can't instantiate abstract class Aapplepay with abstract methods pay
这样就能够引出用代码实现接口类的大体结构,相似的结构以下所示:
from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): # 默认的元类type @abstractmethod def pay(self,money): # 规范子类必须含有pay方法 pass class A(Payment): def pay(self,money):pass class B(Payment): def pay(self,money):pass class C(Payment): def pay(self,money):pass
其实接口类和抽象类都是起到一个规范子类,约束子类的一个做用,不一样的地方是:
接口类:支持多继承,接口类中的全部方法都必须不能实现,这样才能起到规范的做用---Java中
抽象类:不支持多继承,抽象类中的方法能够有一些代码的实现---Java中