、我々はPython 3.4以降では、ABCとABCMetaの使用の違いは何ですか? Pythonの3.4+で
class Foo(abc.ABC):
...
を行うことができますか、我々は
class Foo(metaclass=abc.ABCMeta):
...
を行うことができ、私が知っておくべき二つの間のいずれかの違いがありますか?
、我々はPython 3.4以降では、ABCとABCMetaの使用の違いは何ですか? Pythonの3.4+で
class Foo(abc.ABC):
...
を行うことができますか、我々は
class Foo(metaclass=abc.ABCMeta):
...
を行うことができ、私が知っておくべき二つの間のいずれかの違いがありますか?
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__
@セイウチは - 私は違いがPython3.Xに新しいものではないと考えています。クラスはインスタンスを作成し、メタクラスはクラスを作成します。 Classを呼び出すと、暗黙のメタクラス 'type'がそのクラスに使用されますが、それはわかりません。ほとんどの場合、メタクラスを使用する必要はありませんが、メタクラスを使用して何かを活用することは、私たちの頭の中で常に得られるように思えます。 – inbinder