PEP 3119指出:爲什麼@abstractmethod需要在其元類派生自ABCMeta的類中使用?
的
@abstractmethod
裝飾應僅在類體中使用,並且僅用於一個其元類是(衍生自)ABCMeta
。不支持動態地將抽象方法添加到類中,或者嘗試在創建方法或類時修改抽象狀態。
但是,我找不到解釋爲什麼。具體而言,在沒有明確從ABCMeta
繼承的類中僅使用@abstractmethod
時,我沒有注意到行爲上的差異。在下面的簡單的例子,如果我理解正確的話,做事的正確方法應該是:
import six
from abc import ABCMeta
from abc import abstractmethod
class Base(six.with_metaclass(ABCMeta)):
def __init__(self):
print('Init abstract base')
@abstractmethod
def do_something(self):
pass
class Subclass(Base):
def __init__(self):
super(Subclass, self).__init__()
def do_something(self):
print('Done.')
sub = Subclass()
sub.do_something()
但是,如果我讓Base
類繼承簡單地從object
,並且只使用裝飾需要的時候,我注意到行爲沒有變化。
from abc import abstractmethod
class Base(object):
def __init__(self):
print('Init abstract base')
@abstractmethod
def do_something(self):
pass
class Subclass(Base):
def __init__(self):
super(Subclass, self).__init__()
def do_something(self):
print('Done.')
sub = Subclass()
sub.do_something()
即使在更復雜的體系結構上,我也發現這種情況,所以我想知道:後一種方法何時失敗?