Python のすべてがオブジェクトであり、これらのオブジェクトの「タイプ」(またはクラス) が「タイプ」であることを理解しています。それに型の型も型そのもの。(ここでうまく説明されているように)
私が理解していないのは、この循環参照がどのように実装されているかです。だから私はここを見ました。私が探しているものを説明するかもしれない部分を引用するには:
PyTypeObject* PyObject.ob_type
これはタイプのタイプ、つまりそのメタタイプです。これは PyObject_HEAD_INIT マクロへの引数によって初期化され、その値は通常 &PyType_Type になります。ただし、(少なくとも) Windows で使用可能でなければならない動的にロード可能な拡張モジュールの場合、コンパイラはこれが有効な初期化子ではないと文句を言います。したがって、規則では、PyObject_HEAD_INIT マクロに NULL を渡し、モジュールの初期化関数の開始時にこのフィールドを明示的に初期化してから、他の処理を実行します。これは通常、次のように行われます。
Foo_Type.ob_type = &PyType_Type;
C は OOP ベースではないため、クラスを作成するときに、オブジェクト自体を独自のクラスとして指す属性を持つことができることを理解しています。ここでの私の理解不足が私を混乱状態に陥らせたと確信しています.これが他のスクリプト言語の設計における通常の慣行なのか、それともある種のパターンなのかを誰か指摘できますか?誰かがこれに光を当てることができれば.私はそれに感謝します。
編集:ここで次のことがわかりました:
PyObject* PyType_Type
これは型オブジェクトの型オブジェクトです。Python レイヤーの type および types.TypeType と同じオブジェクトです。
それはどうですか?