(what)什么是抽象基类?
抽象基类它提供了接口,但是又没有去把接口实现的类,需要由子类完成。感觉它就是老板,只告诉你要完成项目A, 你接到项目A后(继承),你自己去把它完成。
抽象基类特点:
1.继承类必须实现抽象基类的方法
2.抽象基类无法实例化
(why)为什么要有抽象基类这玩意?
1.why 抽象基类?
譬如要开发一个项目,你要规定项目开发者要去完成某些接口,有些接口会不会忘记实现了呢?你在担心...这时候抽象基类就帮上忙了,你可以给开发者提供抽象基类,因为它必须让继承它的子类去实现它所要求的方法(这个例子不知道牵强不?)。当然也有其他的优点:处理继承问题方面更加规范、系统,明确调用之间的相互关系,使得继承层次更加清晰。
2. 为什么使用collections.abc
假设我们要编写一种对象,本身虽然不属于list子类,但是却要让它可以像list那样子去访问。例如我们现在想让一颗二叉树可以像list那样子访问,那么我们要实现__geitem__(),要实现__len__(),这个还不完整,还要实现index, count方法,要实现那么多方法很复杂,用collections.abc模块的话,实现了抽象基类所要求的方法,模块会自动实现剩下的那些方法。
(how)如何使用?
我们一般都不会自己去定义抽象基类,而是使用collections.abc模块
例如:
import abc
class A(abc.ABC):#自己定义一个抽象基类,
@abc.abstractmethod
def eat(self):
pass
class B(A):#继承抽象基类
def voice(self):
pass
if __name__ == "__main__":
a = A()
#报错,抽象类无法实现实例化
#TypeError: Can't instantiate abstract class A with abstract methods eat
a = B()
a.eat()
#报错,继承类必须实现抽象类的方法
#TypeError: Can't instantiate abstract class B with abstract methods eat
又如:
from collections import abc
class A(abc.Sequence): #继承抽象基类abc,Sequece
def eat(self):
pass
class B(A):
def __getitem__(self): #必须实现__getitem__()
pass
def __len__(self): #必须实现__len__()
pass
def voice(self):
pass
if __name__ == "__main__":
b = B()
如有不恰当之处,请指出