Python 3.6添加了PEP 487,其中添加了__init_subclass__
方法。是否可以编写不使用元类的ABC
版本?
答案 0 :(得分:3)
如果你关心的只是检查抽象方法,那么是的。只需将abstract method set computation移至child
方法:
__init_subclass__
然后,基础object.__new__
implementation使用非空def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
# Compute set of abstract method names
abstracts = {name
for name, value in vars(cls).items()
if getattr(value, "__isabstractmethod__", False)}
for base in cls.__bases__:
for name in getattr(base, "__abstractmethods__", set()):
value = getattr(cls, name, None)
if getattr(value, "__isabstractmethod__", False):
abstracts.add(name)
cls.__abstractmethods__ = frozenset(abstracts)
集来阻止实例化。
但ABCs也支持virtual subclass registration;要在元类上实现two hook methods this requires 。