Python のメタクラス
このチュートリアルでは、Python のオブジェクト指向コンテキストにあるメタクラスについて説明します。
Python のメタクラス
簡単に言えば、メタクラスはクラスの動作を定義します。通常のクラスは、クラスのオブジェクトまたはインスタンスがどのように動作するかを定義します。
Python では、メタクラスは事前に作成されており、暗黙的です。これは、クラスの作成時にメタクラスがバックグラウンドで作成されることを意味します。
Python の object
基本クラス
Python では、作成されるすべてのクラスは、基本クラス object
を暗黙的に継承します。object
クラスには、__init__
や __new__
などの組み込みのプライベートメソッドがあります。クラスが独自のフィールド、関数、および属性の作成を開始する前に、object
クラスにある属性を継承します。
たとえば、新しいクラス ChildObject
を作成しましょう。このクラス内には、単一の属性と単一の関数の宣言があります。
class ChildObject:
num = 1
def printStatement():
print("This is a child object.")
ChildObject
クラスが object
クラスにある属性と関数を継承することを確認するには、dir()
関数を使用します。これは、指定されたオブジェクトで定義されたすべての関数と属性のリストを返します。
print(dir(ChildObject))
出力:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'num', 'printStatement']
num
属性と printStatement
関数の前に、ChildObject
で明示的に定義されていないプライベート属性と関数がかなりあることに注意してください。これは、それらがクラス内で暗黙的に定義されているか、object
クラスから継承されていることを意味します。
同じ関数 dir()
を使用して、object
クラスの属性と関数を確認しましょう。
print(dir(object))
出力:
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Python の type
メタクラス
object
クラスについて説明したので、Python の実際のメタクラス type
について説明しましょう。繰り返しますが、メタクラスは、別のクラスの動作をインスタンス化して定義するクラスです。
type()
と __class__
の 2つの関数が特定のクラスのメタクラスを公開できます。これらの関数は両方とも、指定された引数のクラスを出力します。
たとえば、上記の例の特定の ChildObject
クラスで type()
関数と __class__
関数を使用してみましょう。
class ChildObject:
num = 1
def printStatement():
print("This is a child object.")
print(type(ChildObject))
print(ChildObject.__class__)
出力:
<class 'type'>
<class 'type'>
どちらの関数も <class 'type'>
を出力します。これは、ChildObject
クラスが type
タイプであることを示します。type
は、ChildObject
クラスおよびその他のクラスのメタクラスです。
要約すると、type
は、インスタンス化されたクラスの動作を暗黙的に定義するメタクラスです。これは、開発者の干渉なしにコードのバックグラウンドで実行されるため、一般的な知識とは見なされません。したがって、メタクラスの概念は、誰かが Python のソースコードとドキュメントを深く掘り下げた場合にのみ知られています。
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn