2015-10-25 5 views
6

、我々はPython 3.4以降では、ABCとABCMetaの使用の違いは何ですか? Pythonの3.4+で

class Foo(abc.ABC): 
    ... 

を行うことができますか、我々は

class Foo(metaclass=abc.ABCMeta): 
    ... 

を行うことができ、私が知っておくべき二つの間のいずれかの違いがありますか?

+0

@セイウチは - 私は違いがPython3.Xに新しいものではないと考えています。クラスはインスタンスを作成し、メタクラスはクラスを作成します。 Classを呼び出すと、暗黙のメタクラス 'type'がそのクラスに使用されますが、それはわかりません。ほとんどの場合、メタクラスを使用する必要はありませんが、メタクラスを使用して何かを活用することは、私たちの頭の中で常に得られるように思えます。 – inbinder

答えて

6

abc.ABC基本的に余分なレイヤーがmetaclass=abc.ABCMetaを超えています。すなわちabc.ABCは暗黙のうちに私たちのメタクラスを定義します。

(出典:https://hg.python.org/cpython/file/3.4/Lib/abc.py#l234

class ABC(metaclass=ABCMeta): 
    """Helper class that provides a standard way to create an ABC using 
    inheritance. 
    """ 
    pass 

唯一の違いは、前者の場合には、単純な継承を必要とし、後者では、あなたがメタクラスを指定する必要があるということです。

What's new in Python 3.4(強調鉱山)から:

新しいクラスABCは、そのメタクラスとしてABCMetaています。基本的に metaclass=abc.ABCMeta,を指定するのと同じ効果を持ちますが、入力するのが簡単でを読むのが簡単です。ABCを基盤として使用すると、 クラスは基本的に同じ効果を持ちます。


関連問題:Create abstract base classes by inheritance rather than a direct invocation of __metaclass__

関連する問題