在导入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)]
不,正如您在the sources中看到的,}(第4136ff行)使用它(如在5532ff中公开的那样)。}使其他从Python无法访问的“走私进来”字段,以避免意外;-)。在
PyCStructType_Type
是一个自定义元类(请参见我刚才提到的C代码中的第327ff行),而{class
语句(特别是当调用自定义元类中的__new__
来创建继承自Structure
的新类时)是所有可访问的C字段都被定义的时候(最好是{确切地说,您试图解决的问题是什么?在您了解额外字段时,通过从头开始重建
A_STRUCT
是无法解决的?例如,如果您的问题是已经存在“旧”A_STRUCT
的实例,那么,很明显,这些实例没有您刚刚了解的新字段,因此修改类,即使通过一些难以置信的扭曲是可行的,也不会有多大用处;-)。在我知道这是一个很老的问题,但您可以通过子类化轻松解决问题:
对于A结构V2类型的对象,“two”将紧跟在“one”之后
如果子类的fields名称与其父类的fields成员重复,则父类的不会被替换,它仍然会使用相同的内存(但是不能通过如下语句访问第二个孩子,第二个成员放在它后面。在
相关问题 更多 >
编程相关推荐