Python のメタクラスを完全に理解するために少しテストを行いました。
class Test(object):
pass
print Test.__class__
print Test.__class__.__class__
print Test.__class__.__class__.__class__
結果はすべて同じtypeです。しかし、それぞれのアドレスは同じ
ではありません。メタクラスがメタクラスを再帰的に持つ理由がよくわかりません。
説明してください。
実際、アドレスは同じです。
>>> id(Test.__class__)
6384576
>>> id(Test.__class__.__class__)
6384576
>>> id(Test.__class__.__class__.__class__)
6384576
Python ではすべてがオブジェクトであり、各オブジェクトにはクラスが必要です (何らかの型に属している必要があります)。__class__属性によってそのクラス/型参照にアクセスできます。たとえば、次のようになります。
>>> (1).__class__
<type 'int'>
すべてには、 と呼ばれるクラス/タイプのクラス自体が含まれますtype。
>>> (1).__class__.__class__
<type 'type'>
同時にtype 'type'>オブジェクトでもあり、何らかのクラス/タイプを参照する必要があります。しかし、これは一種の特別なオブジェクトであるため、その__class__属性はそれ自体を参照します。
>>> (1).__class__.__class__.__class__ is (1).__class__.__class__
True
を実行するとTest.__class__、 の型が返されます(はクラス識別子であるため) Test。typeTest
type__class__それ自体は再びクラス識別子であるため、 (から継承された) を呼び出すことができ、クラス識別子であるためobject、その型が再び返さtypeれます。
クラス自体であることが常に返されるためtype、これを無限に何度も行うことができ、現在のオブジェクトのタイプが であることを常に返すことができますtype。
すべての python のクラス オブジェクトは、組み込み関数 type() によって構築されます。これを試すこともできます。
>>> T.__class__ == type
True
>>> type(type)
<type 'type'>
T.クラスは、 call関数を実装したオブジェクトでもある組み込み関数型と同じです。これは、クラス(T)として解釈される属性です。T クラスには基本クラスがないため、型オブジェクトを返す type() が使用されます。
クラス作成のカスタマイズに関する python doc を確認して、クラス作成の詳細を取得できます。
適切なメタクラスを決定するには
すべてのクラスはクラスです。つまり、クラスと呼ばれるクラスから派生しています...