2017-07-07 26 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__'實現已經做到了。 –

相關問題