1

Python のメタクラスを完全に理解するために少しテストを行いました。

class Test(object):
    pass


print Test.__class__
print Test.__class__.__class__
print Test.__class__.__class__.__class__

結果はすべて同じtypeです。しかし、それぞれのアドレスは同じ
ではありません。メタクラスがメタクラスを再帰的に持つ理由がよくわかりません。
説明してください。

4

4 に答える 4

2

実際、アドレスは同じです。

>>> 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
于 2013-07-31T08:38:50.737 に答える
0

を実行するとTest.__class__、 の型が返されます(はクラス識別子であるため) TesttypeTest

type__class__それ自体は再びクラス識別子であるため、 (から継承された) を呼び出すことができ、クラス識別子であるためobject、その型が再び返さtypeれます。

クラス自体であることが常に返されるためtype、これを無限に何度も行うことができ、現在のオブジェクトのタイプが であることを常に返すことができますtype

于 2013-07-31T08:34:21.890 に答える
0

すべての python のクラス オブジェクトは、組み込み関数 type() によって構築されます。これを試すこともできます。

>>> T.__class__ == type
True
>>> type(type)
<type 'type'>

T.クラスは、 call関数を実装したオブジェクトでもある組み込み関数型と同じです。これは、クラス(T)として解釈される属性です。T クラスには基本クラスがないため、型オブジェクトを返す type() が使用されます。

クラス作成のカスタマイズに関する python doc を確認して、クラス作成の詳細を取得できます。

適切なメタクラスを決定するには

  • ベースも明示的なメタクラスも指定されていない場合、 type() が使用されます
  • 明示的なメタクラスが指定され、それが type() のインスタンスでない場合、メタクラスとして直接使用されます
  • type() のインスタンスが明示的なメタクラスとして指定されている場合、またはベースが定義されている場合、最も派生したメタクラスが使用されます
于 2013-07-31T09:07:10.223 に答える
0

すべてのクラスはクラスです。つまり、クラスと呼ばれるクラスから派生しています...

于 2013-07-31T08:34:49.993 に答える