當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。