## 3 属性を管理する

属性をもつどのオブジェクトに対しても、その型は、 それらオブジェクトの属性をどのように解決するか制御する関数を提供する 必要があります。必要な関数としては、属性を (それが定義されていれば) 取り出すものと、もうひとつは属性に (それが許可されていれば) 値を 設定するものです。属性を削除するのは特殊なケースで、この場合は 新しい値としてハンドラに `NULL`が渡されます。

Python は 2つの属性ハンドラの組をサポートしています。 属性をもつ型はどちらか一組を実装するだけでよく、それらの違いは 一方の組が属性の名前を `char*` として受け取るのに対して もう一方の組は属性の名前を `PyObject*` として受け取る、というものです。 それぞれの型はその実装にとって都合がよい方を使えます。

        getattrfunc  tp_getattr;        /* char * バージョン */
        setattrfunc  tp_setattr;
        /* ... */
        getattrofunc tp_getattrofunc;   /* PyObject * バージョン */
        setattrofunc tp_setattrofunc;

オブジェクトの属性へのアクセスがつねに (すぐあとで説明する) 単純な操作だけならば、`PyObject*` を使って属性を管理する 関数として、総称的 (generic) な実装を使えます。 特定の型に特化した属性ハンドラの必要性は Python 2.2 からほとんど完全に なくなりました。しかし、多くの例はまだ、この新しく使えるようになった 総称的なメカニズムを使うよう更新されてはいません。