[英]Ensure abstract Python method is implemented as a class method (or not)
[英]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.