簡體   English   中英

python - 普通類中的抽象方法

[英]python - abstract method in normal class

我正在閱讀官方的python 文檔

在上述鏈接中,第二行指出:

使用這個裝飾器要求類的元類是ABCMeta或從中派生出來。

但是,我成功地能夠定義下面給出的類。

from abc import abstractmethod

class A(object):
    def __init__(self):
        self.a = 5
    @abstractmethod
    def f(self):
        return self.a

a = A()
a.f()

所以,上面的代碼工作得很好。 而且,我能夠創建一個子類

class B(A):
    def __init__(self):
        super(B, self).__init__() 

b = B()
b.f()

不覆蓋上面定義的抽象方法。

所以,基本上這是否意味着如果我的基類的metaclass不是ABCMeta (或從它派生),那么即使我有一個抽象方法,該類也不像抽象類一樣?

那意味着,文檔需要更清晰嗎?

或者,這種行為在某種程度上是有用的,我錯過了這一點。

所以,基本上這是否意味着如果我的基類的元類不是ABCMeta(或從它派生),那么即使我有一個抽象方法,該類也不像抽象類一樣?

正確。

所有abstractmethod都用__isabstractmethod__ = True標記方法。 ABCMeta完成所有實際工作。 abstractmethod的代碼:

def abstractmethod(funcobj):
    """A decorator indicating abstract methods.
    Requires that the metaclass is ABCMeta or derived from it.  A
    class that has a metaclass derived from ABCMeta cannot be
    instantiated unless all of its abstract methods are overridden.
    The abstract methods can be called using any of the normal
    'super' call mechanisms.
    Usage:
        class C(metaclass=ABCMeta):
            @abstractmethod
            def my_abstract_method(self, ...):
                ...
    """
        funcobj.__isabstractmethod__ = True
        return funcobj

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM