27.接口类和抽象类(@abstractclassmethod)
接口类:python原生不支持的,支持多继承,接口类中的所有方法都必须不能实现
抽象类:python原生支持的,不支持多继承,抽象类中的方法可以有一些代码的实现
抽象类:
把一个类变成抽象类,给父类属性添加@abstractclassmethod后,就必须在其子类中也实现相同的方法,限制子类必须实现某些方法
from abc import abstractclassmethod,ABCMeta class Swim_Animal(metaclass=ABCMeta): @abstractclassmethod def swim(self): #父类的函数不需要实现任何功能,但是子类必须实现定义该功能 pass
抽象类也是一种规范
一般情况下,单继承中函数能实现的功能都是一样的
多继承的情况,由于功能比较复杂,不容易抽象出相同的功能的具体实现写在父类中
接口类:
from abc import abstractclassmethod,ABCMeta class Swim_Animal(metaclass=ABCMeta): @abstractclassmethod def swim(self): pass class Fly_Animal(metaclass=ABCMeta): @abstractclassmethod def swim(self): pass class Qingwa(Swim_Animal): def swim(self): pass class Tiane(Swim_Animal,Fly_Animal): def swim(self): pass def fly(self): pass
接口隔离原则:
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些不需要的接口
即实现不同的功能,就应该使用不同的函数,继承不同的函数,功能要分开
总结:
抽象类和接口类:都是面向对象的开发规范
python中没有接口类,因为python自带多继承,直接用class来实现接口类,接口类不能实例化
python中支持抽象类,一般情况下,所有的抽象类都是单继承的,抽象类也不能实例化
在Java的角度上看,抽象类和接口类是由区别的:
Java本来就支持单继承,所以就有了抽象类
java没有多继承,所以为了接口隔离原则,设计了接口这个概念,支持多继承了
在python的角度来看,两者的区别不明显:
pyhton即支持多继承也支持单继承,所以对于接口类和抽象类的区别不明显
甚至在python中就根本没有内置接口类

浙公网安备 33010602011771号