今回のケースではここまでで返ってると思うので省略}今の場合、typeはType_Typeが渡されているので、TYPEはType_Typeです(ややこしい)。attribute」のところで指定された属性__prepare__が返されるはず。_PyType_Lookupは基本的にはtp_dictから指定された属性を取得する関数です。基本的じゃない点としてはメソッドキャッシュしたり継承さかのぼって属性探したりとかしているわけですが、今回はあまり関係ないので追っかけるのはやめておきます。†さて、追っかけないといけない方の話をしましょう。PyType_ReadyにてTypeObjectの初期化が行われているようです。実際には_Py_InitializeEx_Privateの中で_Py_ReadyTypes(Objects/object.c)が呼ばれおり、そこで一連のTypeObjectについてPyType_Readyが呼ばれている、つまりバイトコードを動かす段階まで来ているのであればType_Typeの初期化はすでに完了しているという状態です。PyType_Readyは長いので、__prepare__がtp_dictに登録される周辺部分だけ確認しましょう。心配しなくても(?)また出てきます。__prepare__はここに書かれています。{0}};PyMethodDefは前にbultinでも出てきましたね。type_methodsはType_Type定義時に指定されています。}add_methodsに進む。add_operatorはTypeObjectに直接書かれているtp_reprなどの特殊メソッドの追加、add_membersは構造体メンバにアクセスするためのデスクリプタの追加、add_getsetは同じくデスクリプタなんだけど実装を個別に書ける式のようです。0;}あれ?デスクリプタ?先ほどtype_getattroでデスクリプタの場合の処理省略したけどそっちが使われてるんですね。デスクリプタ関連はObject/descrobject.cに書かれています。†では読み違えていたところに戻りましょう。}前述したように今はtypeもmetatype同じになりますが、metaの方はPyDescr_IsDataの条件(tp_descr_setが定義されていたら真)があるので実際に呼び出されるのはlocal_getの方です。いうわけでdescr_getとして呼び出されるclassmethod_get。エラー処理削ると一行だけです。NULL);}ここでCFunctionObjectにラップされるか。回り道が長引いたので一旦ここで区切ります。今回は__build_class__、というよりCでのオブジェクト実装の動作について見てきました。その際、PyTypeObjectに登録されている関数が呼び出されていることがわかりました。PyTypeObjectに直接書かれている特殊メソッドおよび通常のメソッドなどはPyTypeObjectの辞書にデスクリプタとして登録されることがわかりました。