抽象类和接口类
抽象类
抽象类是一个模板,不能被实例化,只能被继承
抽象类不鼓励多继承
抽象类可以实现一些子类共有的功能和属性,也就是说子类中有父类中的全部方法
抽象类的定义,抽象类中的方法可以实现,可以不实现
from abc import ABCMeta,abstractmethod class Base(metaclass=ABCMeta): def __init__(self,filename): self.filename = filename @abstractmethod #抽象方法 def open(self): return 'file_handler' @abstractmethod def close(self):pass @abstractmethod def read(self):pass @abstractmethod def write(self):pass class File(Base): def open(self):pass def close(self):pass def read(self):pass def write(self):pass
接口类:约束子类中必须含有父类中的方法
依赖倒置原则:
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。
换言之,要针对接口编程,而不是针对实现编程
python没有接口的概念,只能借助抽象类的模块来实现接口类
接口来源于java ,java里没有多继承,interface关键字使java支持多继承
接口类也是规范子类的一个模板,同样也不能被实例化,只能被继承
接口类支持多继承(子类能够继承多个接口类),父类中的方法可以不实现功能
接口隔离原则: 使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。
继承接口类的子类中必须有接口类中的所有的方法
class Payment(metaclass=ABCMeta): #模板,接口类 @abstractmethod #装饰接口类中方法的,加上这个装饰器,自动检测子类中的方法名 def pay(self,money):pass @abstractmethod # 没有这个方法,报错 def get(self):pass class Apple_Pay(Payment): def pay(self,money): print('您使用苹果支付支付了%s元'%money) class Ali_Pay(Payment): def pay(self, money): print('您使用支付宝支付了%s元' % money) class WeChat_Pay(Payment): def pay(self,money): print('您使用微信支付了%s元' % money) def pay(obj,money): return obj.pay(money)
如果子类中没有接口类中的方法,实例化时就会报错
继承普通类不用写父类中的方法,而接口类和抽象类的子类要写父类中的方法
举栗子,
定义一个抽象类,它里面有跑,飞,游三个属性,他的子类实例化的对象就能跑飞游
然而,并不是所有的子类都会跑飞游,这时就可以定义三个接口类,分别拥有跑飞游的方法,
这时就可以让子类去选择继承接口类,能实现那个就继承哪个

浙公网安备 33010602011771号