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()
即使在更复杂的体系结构上,我也发现这种情况,所以我想知道:后一种方法何时失败?