メタクラスは、Python でクラス オブジェクトを作成する役割を果たします。クラスがインスタンスを作成するのと同じように、メタクラスもクラスを作成します。これらは、クラス作成プロセスに対する制御層を提供し、クラスの動作と属性のカスタマイズを可能にします。
Python では、クラスはブループリントを記述するオブジェクトです。新しいインスタンスまたはオブジェクトを作成するため。これは、クラス自体が、class キーワードを使用したクラスの「説明」から作成されたインスタンスであることを意味します。したがって、次のステートメントは ObjectCreator という名前のクラス オブジェクトを作成します。
class ObjectCreator(object): pass
クラスはオブジェクトであるため、実行時でも動的に作成できます。 type 関数を使用すると、名前、ベース、属性を引数として指定してクラスを定義できます。新しく作成されたクラス オブジェクトを返します。
Foo = type('Foo', (), {'bar': True}) print(Foo) # <class '__main__.Foo'> print(Foo.bar) # True
次に、メタクラスについて説明します。これらは、これらのクラス オブジェクトを作成する「もの」です。クラスがインスタンスを作成するのと同じように、メタクラスもクラスを作成します。これらは事実上、Python が class キーワードを使用して定義されたクラスを作成するために自動的に使用する舞台裏のクラスです。
Python 2 では、 __metaclass__ 属性は、クラスを作成するためにカスタム メタクラスを使用するクラスを定義するときに使用します。 Python 3 では、これは基本クラスのリスト内のキーワード引数に置き換えられました。
# Python 2 class Foo(object, __metaclass__=MyMetaclass): ... # Python 3 class Foo(object, metaclass=MyMetaclass): ...
メタクラスは、作成したクラスを変更して、動的なクラスを実現できます。クラスの振る舞い。たとえば、すべてのクラス属性を自動的に大文字に変換するメタクラスを定義できます:
class UpperAttrMetaclass(type): def __new__(cls, clsname, bases, attrs): uppercase_attrs = { attr if attr.startswith('__') else attr.upper(): v for attr, v in attrs.items() } return super().__new__(cls, clsname, bases, uppercase_attrs)
その後、このメタクラスを使用して大文字の属性を持つクラスを作成できます:
class Foo(object, metaclass=UpperAttrMetaclass): bar = 'bip' print(Foo.bar) # 'BIP'
通常、メタクラスは必要ありませんが、メタクラスは抽象化された API の作成に使用される場合があります。単純なインターフェイスの背後にあるクラス変更の複雑さ。たとえば、Django の ORM はメタクラスを使用して、CharField や IntegerField などの単純なステートメントを使用してデータベース フィールドを定義できるようにします。
Python のメタクラスは、クラスの作成を制御できる強力なツールです。ただし、これらは複雑であるため、不必要な複雑化を避けるために必要な場合にのみ使用する必要があることに注意することが重要です。
以上がメタクラスは Python でどのように機能してクラスを作成およびカスタマイズしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。