ctypes.结构运行时修改字段

2024-05-08 00:33:59 发布

您现在位置:Python中文网/ 问答频道 /正文

在导入ctypes.Structure之后,是否可以修改_fields_的定义?在

比如:

from ctypes import *

class A_STRUCT(Structure):
     _fields_ = [("one",c_int)]

A_STRUCT._fields_.append(("two",c_int))

x = A_STRUCT()
print x.one
print x.two

不足为奇的是:

^{pr2}$

编辑

我的用例是我有两个版本的A_STRUCT。版本2与版本1末尾附加了附加字段的情况相同。我希望能避免这样的事情。直到运行时我才知道需要哪个版本的结构。在

class A_STRUCT_V1(Structure):
     _fields_ = [("one",c_int)]

class A_STRUCT_V2(Structure):
     _fields_ = [("one",c_int),("two",c_int)]

Tags: fromimport版本fields定义ctypesstructureone
2条回答

不,正如您在the sources中看到的,PyCStructType_Type是一个自定义元类(请参见我刚才提到的C代码中的第327ff行),而{}(第4136ff行)使用它(如在5532ff中公开的那样)。class语句(特别是当调用自定义元类中的__new__来创建继承自Structure的新类时)是所有可访问的C字段都被定义的时候(最好是{}使其他从Python无法访问的“走私进来”字段,以避免意外;-)。在

确切地说,您试图解决的问题是什么?在您了解额外字段时,通过从头开始重建A_STRUCT是无法解决的?例如,如果您的问题是已经存在“旧”A_STRUCT的实例,那么,很明显,这些实例没有您刚刚了解的新字段,因此修改类,即使通过一些难以置信的扭曲是可行的,也不会有多大用处;-)。在

我知道这是一个很老的问题,但您可以通过子类化轻松解决问题:

class A_STRUCT_V1(Structure):
     _fields_ = [("one",c_int)]

class A_STRUCT_V2(A_STRUCT_V1):
     _fields_ = [("two",c_int)]

对于A结构V2类型的对象,“two”将紧跟在“one”之后

如果子类的fields名称与其父类的fields成员重复,则父类的不会被替换,它仍然会使用相同的内存(但是不能通过如下语句访问第二个孩子,第二个成员放在它后面。在

相关问题 更多 >