*args, **kw) |
*args, **kw) |
*args, **kw) |
ネイティブではないバイトオーダーを持つ構造体にポインタ型フィールドあるいは ポインタ型フィールドを含む他のどんなデータ型をも入れることはできません。
*args, **kw) |
具象構造体型と具象共用体型はこれらの型の一つをサブクラス化することで
作らなければなりません。少なくとも、_fields_クラス変数を
定義する必要があります。ctypes
は、属性に直接アクセスしてフィールドを
読み書きできるようにする記述子を作成するでしょう。これらは、
c_intのような整数型のために、オプションの第三要素を 与えることができます。フィールドのビット幅を定義する 正の小整数である必要があります。
一つの構造体と共用体の中で、フィールド名はただ一つである必要があります。 これはチェックされません。名前が繰り返しでてきたときにアクセスできるのは 一つのフィールドだけです。
Structureサブクラスを定義するクラス文の後で、 _fields_クラス変数を定義することができます。 これにより自身を直接または間接的に参照するデータ型を 作成できるようになります:
class List(Structure): pass List._fields_ = [("pnext", POINTER(List)), ... ]
しかし、_fields_クラス変数はその型が最初に使われる
(インスタンスが作成される、それに対してsizeof()
が呼び出されるなど)より前に
定義されていなければなりません。その後_fields_クラス変数へ代入すると
AttributeErrorが発生します。
構造体および共用体サブクラスは位置引数と名前付き引数の両方を受け取ります。 位置引数は_fields_定義中に現れたのと同じ順番で フィールドを初期化するために使われ、 名前付き引数は対応する名前を使ってフィールドを初期化するために 使われます。
構造体型のサブクラスを定義することができ、もしあるならサブクラス内で 定義された_fields_に加えて、ベースクラスのフィールドも 継承します。
_anonymous_
がすでに
定義されていなければならない。そうでなければ、何ら影響はありません。
この変数に並べあげられたフィールドは構造体型もしくは共用体型フィールドで
ある必要があります。構造体フィールドまたは共用体フィールドを作る必要なく、
入れ子になったフィールドに直接アクセスできるようにするために、
ctypes
は構造体型の中に記述子を作成します。
型の例です(Windows):
class _U(Union): _fields_ = [("lptdesc", POINTER(TYPEDESC)), ("lpadesc", POINTER(ARRAYDESC)), ("hreftype", HREFTYPE)] class TYPEDESC(Structure): _fields_ = [("u", _U), ("vt", VARTYPE)] _anonymous_ = ("u",)
TYPEDESC
構造体はCOMデータ型を表現しており、vt
フィールドは
共用体フィールドのどれが有効であるかを指定します。u
フィールドは
匿名フィールドとして定義されているため、TYPEDESCインスタンスから取り除かれて
そのメンバーへ直接アクセスできます。
td.lptdesc
とtd.u.lptdesc
は同等ですが、前者がより高速です。
なぜなら一時的な共用体インスタンスを作る必要がないためです:
td = TYPEDESC() td.vt = VT_PTR td.lptdesc = POINTER(some_type) td.u.lptdesc = POINTER(some_type)
構造体のサブ-サブクラスを定義することができ、ベースクラスのフィールドを 継承します。サブクラス定義に別の_fields_変数がある場合は、 この中で指定されたフィールドはベースクラスのフィールドへ追加されます。
構造体と共用体のコンストラクタは位置引数とキーワード引数の両方を受け取ります。 位置引数は_fields_の中に現れたのと同じ順番でメンバーフィールドを 初期化するために使われます。コンストラクタのキーワード引数は属性代入として解釈され、 そのため、同じ名前をもつ_fields_を初期化するか、 _fields_に存在しない名前に対しては新しい属性を作ります。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。