我可以在不使用Python 3.6中的元类的情况下编写abc.ABC吗?

时间:2017-07-07 18:06:28

标签: python metaclass abc

Python 3.6添加了PEP 487,其中添加了__init_subclass__方法。是否可以编写不使用元类的ABC版本?

1 个答案:

答案 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