Python のメタクラス

Rayven Esplanada 2021年8月10日
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 のソースコードとドキュメントを深く掘り下げた場合にのみ知られています。

Rayven Esplanada avatar Rayven Esplanada avatar

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

関連記事 - Python Class