设置 ABCMeta 元类

抽象类是要继承的类,但是避免实现特定的方法,只留下子类必须实现的方法签名。

抽象类对于在高级别定义和实施类抽象非常有用,类似于类型语言中的接口概念,而无需方法实现。

定义抽象类的一种概念方法是删除类方法,然后在访问时引发 NotImplementedError。这可以防止子类访问父方法而不首先覆盖它们。像这样:

class Fruit:
    
    def check_ripeness(self):
        raise NotImplementedError("check_ripeness method not implemented!")

class Apple(Fruit):
    pass

a = Apple()
a.check_ripeness() # raises NotImplementedError

以这种方式创建抽象类可以防止不正确地使用未被覆盖的方法,并且当然鼓励在子类中定义方法,但它不会强制执行它们的定义。使用 abc 模块,我们可以防止子类在无法覆盖其父级和祖先的抽象类方法时被实例化:

from abc import ABCMeta

class AbstractClass(object):
    # the metaclass attribute must always be set as a class variable 
    __metaclass__ = ABCMeta

   # the abstractmethod decorator registers this method as undefined
   @abstractmethod 
   def virtual_method_subclasses_must_define(self):
       # Can be left completely blank, or a base implementation can be provided
       # Note that ordinarily a blank interpretation implicitly returns `None`, 
       # but by registering, this behaviour is no longer enforced.

现在可以简单地子类化和覆盖:

class Subclass(AbstractClass):
    def virtual_method_subclasses_must_define(self):
        return