デスクリプタオブジェクト (descriptor object)
********************************************

"デスクリプタ (descriptor)" は、あるオブジェクトのいくつかの属性につい
て記述したオブジェクトです。デスクリプタオブジェクトは型オブジェクトの
辞書内にあります。

PyObject *PyDescr_NewGetSet(PyTypeObject *type, struct PyGetSetDef *getset)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   "PyGetSetDef" 構造体 *getset* から、拡張型 *type* 用の新しい get-
   set デスクリプタを作成します。

   get-set デスクリプタは、インスタンスに直接格納される属性ではなく、C
   のゲッター関数とセッター関数で実装された属性を公開します。
   "tp_getset" のエントリーに対して作られるものと同じ種類のデスクリプ
   タで、Python では "types.GetSetDescriptorType" オブジェクトとして扱
   われます。

   成功するとデスクリプタへの *強参照* を返します。 失敗すると例外を設
   定して "NULL" を返します。

PyObject *PyDescr_NewMember(PyTypeObject *type, struct PyMemberDef *member)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   "PyMemberDef" 構造体 *member* から、拡張型 *type* 用の新しいメンバ
   ーデスクリプタを作成します。

   メンバーデスクリプタは、型の C 構造体のフィールドを Python の属性と
   して公開します。 "tp_members" のエントリーに対して作られるものと同
   じ種類のデスクリプタで、Python では "types.MemberDescriptorType" オ
   ブジェクトとして扱われます。

   成功するとデスクリプタへの *強参照* を返します。 失敗すると例外を設
   定して "NULL" を返します。

PyTypeObject PyMemberDescr_Type
    * 次に属します: Stable ABI.*

   "PyMemberDef" 構造体から作成されるメンバーデスクリプタオブジェクト
   の型オブジェクトです。 これらのデスクリプタは C 構造体のフィールド
   を型の属性として公開し、Python の "types.MemberDescriptorType" オブ
   ジェクトに対応します。

PyTypeObject PyGetSetDescr_Type
    * 次に属します: Stable ABI.*

   "PyGetSetDef" 構造体から作成される get/set デスクリプタオブジェクト
   の型オブジェクトです。 これらのデスクリプタは、値を C のゲッター関
   数やセッター関数で計算する属性を実装し、多くの組み込み型の属性に使
   われています。 Python の "types.GetSetDescriptorType" オブジェクト
   に対応します。

PyObject *PyDescr_NewMethod(PyTypeObject *type, struct PyMethodDef *meth)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   "PyMethodDef" 構造体 *meth* から、拡張型 *type* 用の新しいメソッド
   デスクリプタを作成します。

   メソッドデスクリプタは C 関数を型のメソッドとして公開します。
   "tp_methods" のエントリーに対して作られるものと同じ種類のデスクリプ
   タで、Python では "types.MethodDescriptorType" オブジェクトとして扱
   われます。

   成功するとデスクリプタへの *強参照* を返します。 失敗すると例外を設
   定して "NULL" を返します。

PyTypeObject PyMethodDescr_Type
    * 次に属します: Stable ABI.*

   "PyMethodDef" 構造体から作成されるメソッドデスクリプタオブジェクト
   の型オブジェクトです。 これらのデスクリプタは C 関数を型のメソッド
   として公開し、Python の "types.MethodDescriptorType" オブジェクトに
   対応します。

PyTypeObject PyWrapperDescr_Type
    * 次に属します: Stable ABI.*

   The type object for wrapper descriptor objects created by
   "PyDescr_NewWrapper()" and "PyWrapper_New()".

   ラッパーデスクリプタは、型のスロットで実装される "__repr__" や
   "__add__" などの特殊メソッドを公開するために内部で使われます。 この
   型は Python では "types.WrapperDescriptorType" として公開されていま
   す。

PyObject *PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *base, void *wrapped)
    *戻り値: 新しい参照。*

   "PyWrapperDescr_Type" 型の新しいラッパーデスクリプタを作成します。

   この関数は内部での使用のみを想定しています。 この関数と関連 API
   ("struct wrapperbase" および "PyWrapperFlag_KEYWORDS" フラグ) は、
   後方互換性のために公開されています。

   C 関数をラップするには "PyCMethod_New()" を参照してください。

PyObject *PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   "PyMethodDef" 構造体 *method* から、拡張型 *type* 用の新しいクラス
   メソッドデスクリプタを作成します。

   クラスメソッドデスクリプタは、アクセスされた際にインスタンスの代わ
   りにクラスを受け取る C メソッドを公開します。 "tp_methods" の
   "METH_CLASS" エントリーに対して作られるものと同じ種類のデスクリプタ
   で、Python では "types.ClassMethodDescriptorType" オブジェクトとし
   て扱われます。

   成功するとデスクリプタへの *強参照* を返します。 失敗すると例外を設
   定して "NULL" を返します。

int PyDescr_IsData(PyObject *descr)

   デスクリプタオブジェクト *descr* がデータ属性を表す場合はゼロ以外、
   メソッドを表す場合は "0" を返します。 *descr* はデスクリプタオブジ
   ェクトでなければなりません。 エラーチェックは行いません。

PyObject *PyWrapper_New(PyObject *d, PyObject *self)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   ラッパーデスクリプタ *d* とインスタンス *self* から、新しい束縛済み
   ラッパーオブジェクトを作成します。

   これは "PyDescr_NewWrapper()" で作成されるラッパーデスクリプタを束
   縛したものです。 CPython はインスタンスを介してスロットラッパーにア
   クセスしたときにこのオブジェクトを作成し、Python では
   "types.MethodWrapperType" オブジェクトとして扱われます。

   成功するとラッパーオブジェクトへの *強参照* を返します。 失敗すると
   例外を設定して "NULL" を返します。

PyDescr_TYPE(descr)

   デスクリプタ *descr* が属する型への *借用参照* を返します。 Python
   では "__objclass__" からアクセスできます。

   *descr* は "PyDescr_New*" 関数のいずれかで作成されたデスクリプタオ
   ブジェクト ("PyMethodDescr_Type"、"PyClassMethodDescr_Type"、
   "PyMemberDescr_Type"、"PyGetSetDescr_Type"、"PyWrapperDescr_Type"
   のいずれかのインスタンス) でなければなりません。 渡されたデスクリプ
   タがこれらの型のインスタンスでない場合、動作は未定義です。

PyDescr_NAME(descr)

   デスクリプタ *descr* の名前を "str" オブジェクトへの *借用参照* と
   して返します。 Python では "__name__" からアクセスできます。

   *descr* は "PyDescr_New*" 関数のいずれかで作成されたデスクリプタオ
   ブジェクトでなければなりません。 そうでない場合、動作は未定義です。

PyDescr_COMMON

   デスクリプタオブジェクトの共通フィールドを含むマクロです。

   これは誤って Python の C API に含められたものです。 拡張モジュール
   では使わないでください。 独自のデスクリプタオブジェクトを作成するに
   は、デスクリプタプロトコル ("tp_descr_get" と "tp_descr_set") を実
   装するクラスを作成してください。

   バージョン 3.15 で ソフト非推奨 <Soft deprecated>.


組み込みデスクリプタ
====================

PyTypeObject PyProperty_Type
    * 次に属します: Stable ABI.*

   プロパティオブジェクトの型オブジェクトです。 Python レベルの
   "property" と同じオブジェクトです。

PyTypeObject PySuper_Type
    * 次に属します: Stable ABI.*

   super オブジェクトの型オブジェクトです。 Python レベルの "super" と
   同じオブジェクトです。

PyTypeObject PyClassMethod_Type

   クラスメソッドオブジェクトの型です。 Python レベルの "classmethod"
   と同じオブジェクトです。

PyTypeObject PyClassMethodDescr_Type
    * 次に属します: Stable ABI.*

   The type object for C-level class method descriptor objects. This
   is the type of the descriptors created for "classmethod()" defined
   in C extension types, and corresponds to
   "types.ClassMethodDescriptorType" objects in Python.

PyObject *PyClassMethod_New(PyObject *callable)

   *callable* をラップする新しい "classmethod" オブジェクトを作成しま
   す。 *callable* は呼び出し可能オブジェクトでなければならず、"NULL"
   にはできません。

   成功すると、新しいクラスメソッドデスクリプタへの *強参照* を返しま
   す。 失敗すると例外を設定して "NULL" を返します。

PyTypeObject PyStaticMethod_Type

   静的メソッドオブジェクトの型です。 Python レベルの "staticmethod"
   と同じオブジェクトです。

PyObject *PyStaticMethod_New(PyObject *callable)

   *callable* をラップする新しい "staticmethod" オブジェクトを作成しま
   す。 *callable* は呼び出し可能オブジェクトでなければならず、"NULL"
   にはできません。

   成功すると、新しい静的メソッドデスクリプタへの *強参照* を返します
   。 失敗すると例外を設定して "NULL" を返します。
