実際、アドレスは同じです。
>>> 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