如果一个类包含一个或多个抽象方法,则该类称为Abstract类。抽象方法是已声明但不包含任何实现的方法。抽象类可能无法实例化,其抽象方法必须由其子类实现。
当诸如hasattr()之类的其他技术笨拙或微妙的错误(例如,使用魔术方法)时,抽象基类提供了一种定义接口的方法。ABC引入了虚拟子类,这些子类不是从类继承的,但仍可以被isinstance()和issubclass()函数识别。Python中有许多内置的ABC。在collections.abc模块中定义了数据结构的ABC,例如迭代器,生成器,集合,映射等。数字模块定义数字塔,它是数字数据类型的基类的集合。Python库中的“ abc”模块提供了用于定义自定义抽象基类的基础结构。
'abc'通过将基类的方法标记为抽象来工作。这由@absttractmethod装饰器完成。然后,作为此类抽象基类的子类的具体类将通过覆盖其抽象方法来实现抽象基。
abc模块定义ABCMeta类,该类是用于定义抽象基类的元类。以下示例使用ABCMeta将Shape类定义为抽象基类。shape类具有由abstractmethod装饰的area()方法。
现在,一个Rectangle类将Shape类上面的作为其父类,并实现了abstract area()方法。由于它是一个具体的类,因此可以实例化它,并可以调用实现的area()方法。
import abc class Shape(metaclass=abc.ABCMeta): @abc.abstractmethod def area(self): pass class Rectangle(Shape): def __init__(self, x,y): self.l = x self.b=y def area(self): return self.l*self.b r = Rectangle(10,20) print ('area: ',r.area())
请注意,抽象基类可能具有多个抽象方法。子类必须实现所有它们,否则将引发TypeError。
abc模块还定义了ABC帮助程序类,该类可用于代替抽象基类的ABCMeta类。
class Shape(abc.ABC): @abc.abstractmethod def area(self): pass
代替从抽象基类进行子类化,可以通过寄存器类装饰器将其注册为抽象基。
class Shape(abc.ABC): @abc.abstractmethod def area(self): pass @Shape.register class Rectangle(): def __init__(self, x,y): self.l = x self.b=y def area(self): return self.l*self.b
您还可以分别通过装饰器@abstractclassmethod和@abstractstatic方法装饰器在抽象基类中提供类方法和静态方法。