2017-07-07 8 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

なぜこの質問が下落したのか分かりません... –

答えて

2

気になるのは抽象メソッドのチェックです。ただ、__init_subclass__方法にabstract method set computationを移動:

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

@ NeeG:申し訳ありませんが、基本的な 'object .__ new__'実装はこれを既に行います。 –

関連する問題