2017-07-07 27 views
0

Python 3.6增加了PEP 487,其中增加了__init_subclass__方法。是否有可能编写不使用元类的ABC版本?我可以在不使用Python 3.6中的元类的情况下编写abc.ABC吗?

+0

如果你关心的是抽象方法的检查,那么是的。但是abcs也支持[虚拟子类注册](https://docs.python.org/3/library/abc.html#abc.ABCMeta.register)。 –

+0

@MartijnPieters是的,我的意思是指定我关心的是检查抽象方法。 –

+0

不知道为什么这个问题是downvoted ... –

回答

2

如果你关心的只是检查抽象方法,那么是的。只要将abstract method set computation__init_subclass__方法:

def __init_subclass__(cls): 
    super().__init_subclass__() 
    # 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__ implementation然后使用一个非空__abstractmethods__设置为阻止实例化。

但是ABC也支持virtual subclass registration; two hook methods this requires具有要在元类上实现。

+0

如何实现对抽象方法的检查? –

+0

好吧,如果没有使用元类,剩下的抽象方法可以阻止'__new__'中的实例化吗? –

+1

@NeilG:对不起,基础的'object .__ new__'实现已经做到了。 –

相关问题