当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python abc.abstractmethod用法及代码示例


用法:

@abc.abstractmethod

指示抽象方法的装饰器。

使用这个装饰器需要类的元类是ABCMeta 或者是从它派生的。除非重写其所有抽象方法和属性,否则无法实例化具有从 ABCMeta 派生的元类的类。可以使用任何正常的‘super’ 调用机制来调用抽象方法。 abstractmethod() 可用于声明属性和说明符的抽象方法。

仅使用update_abstractmethods() 函数支持向类动态添加抽象方法,或尝试修改方法或类的抽象状态。 abstractmethod() 仅影响使用常规继承派生的子类;使用 ABC 的 register() 方法注册的 “virtual subclasses” 不受影响。

abstractmethod()与其他方法说明符结合应用时,应作为最内层的装饰器应用,如以下使用示例所示:

class C(ABC):
    @abstractmethod
    def my_abstract_method(self, arg1):
        ...
    @classmethod
    @abstractmethod
    def my_abstract_classmethod(cls, arg2):
        ...
    @staticmethod
    @abstractmethod
    def my_abstract_staticmethod(arg3):
        ...

    @property
    @abstractmethod
    def my_abstract_property(self):
        ...
    @my_abstract_property.setter
    @abstractmethod
    def my_abstract_property(self, val):
        ...

    @abstractmethod
    def _get_x(self):
        ...
    @abstractmethod
    def _set_x(self, val):
        ...
    x = property(_get_x, _set_x)

为了与抽象基类机制正确互操作,说明符必须使用 __isabstractmethod__ 将自己标识为抽象。通常,如果用于构成说明符的任何方法是抽象的,则此属性应为True。例如,Python 的内置 property 相当于:

class Descriptor:
    ...
    @property
    def __isabstractmethod__(self):
        return any(getattr(f, '__isabstractmethod__', False) for
                   f in (self._fget, self._fset, self._fdel))

注意

与 Java 抽象方法不同,这些抽象方法可能有一个实现。可以通过super() 机制从覆盖它的类调用此实现。这对于使用协作multiple-inheritance 的框架中的super-call 作为end-point 可能很有用。

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 abc.abstractmethod。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。