Python 3.6添加了PEP 487,该__init_subclass__
方法除其他外还添加了一种方法。是否可以编写ABC
不使用元类的版本?
如果您只关心检查抽象方法,则可以。只需将抽象方法集计算移至该__init_subclass__
方法:
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)
然后,基本object.__new__
实现使用非空__abstractmethods__
集来防止实例化。
但是ABC还支持虚拟子类注册; 该两个钩形方法,这需要 有要在元类实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句