上記の導入を通じて、最終的には漠然とメタクラスに取り込みました。しかし、メタクラスが何なのかはまだわかりません。
クラスを作成するとき、そのほとんどはクラスのインスタンス オブジェクトを作成することです。メタクラスについてはどうでしょうか?メタクラスはクラスの作成に使用されます。これを理解する別の方法は、メタクラスはクラスのクラスであるということです。
上記の type() 関数の紹介により、type() 関数を通じてクラスを作成できることがわかりました。
MyClass = type('MyClass', (), {})
実際、type() 関数はメタクラスです。 type() は、Python がすべてのクラスを作成するためにバックグラウンドで使用するメタクラスです。
これで、type() 関数が Type ではなく type になっている理由も推測できるようになりました。
これは、文字列オブジェクトの作成に使用されるクラスである str と、整数オブジェクトの作成に使用されるクラスである int との一貫性を保つためである可能性があります。 type は、クラス オブジェクトを作成するクラスです。これは、__class__ 属性を検査することで確認できます。 Python ではすべてがオブジェクトであることに注意してください。ここではすべてを意味します。これには、整数、文字列、関数、クラスが含まれます。これらはすべてオブジェクトであり、すべてクラスから作成されます。
# 整形 age = 23 print(age.__class__) # 字符串 name = '两点水' print(name.__class__) # 函数 def fu(): pass print(fu.__class__) # 实例 class eat(object): pass mEat = eat() print(mEat.__class__)
出力結果は次のとおりです:
<class 'int'> <class 'str'> <class 'function'> <class '__main__.eat'>
ご覧のとおり、上記のすべて、つまりすべてのオブジェクトはクラスを通じて作成されています。そうすると、__class__ の __class__ には何ができるのかが気になるかもしれません。それはありますか?言い換えれば、これらのクラスを作成するクラスは何でしょうか?
上記のコードに基づいて、次のコードを追加し続けることができます:
print(age.__class__.__class__) print(name.__class__.__class__) print(fu.__class__.__class__) print(mEat.__class__.__class__)
出力結果は次のとおりです:
<class 'type'> <class 'type'> <class 'type'> <class 'type'>
上記の内容を注意深く観察して明確にしてください。出力 結果は、オブジェクトインスタンス mEat の __class__ の整数年齢、キャラクター作成名、関数 fu および __class__ を出力した結果です。クラスがクラスの結果を印刷するとも言えます。印刷されたクラスはすべて type であることがわかります。
最初に述べたように、メタクラスはクラスのクラスです。言い換えれば、メタクラスはクラスの作成を担当するものです。メタクラスがクラスの生成を担当していることも理解できます。 type は組み込みのメタクラスです。つまり、Python 独自のメタクラスです。
次のセクション