[英]ctypes.Structure Modify _fields_ at Run Time
是否有可能修改_fields_
的定义ctypes.Structure
它已经导入后?
就像是:
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
毫不奇怪,这失败了:
0
Traceback (most recent call last):
File "structEnumTest.py", line 10, in <module>
print x.two
AttributeError: 'A_STRUCT' object has no attribute 'two'
EDITS
我的用例是我有两个版本的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)]
不,正如您在源代码中所看到的那样, PyCStructType_Type
是一个自定义元类(请参见我刚刚指向的C代码中的327ff行),而Structure
(4136ff行)使用它(如5532ff中所公开)。 class
语句(特别是当__new__
自定义元类中的__new__
以使新类继承自Structure
)是在实际定义所有C可访问字段时(使用ctypes
可以使其他“走私”字段无法从中访问) Python也要避免事故;-)。
您到底想解决什么问题, A_STRUCT
在了解额外字段A_STRUCT
无法通过从头开始重建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_STRUCT_V2的对象,内存中的“两个”将立即跟随“一个”
如果子类字段名称重复其父类字段成员, 则不替换父类的成员,它仍占用相同的内存(尽管无法通过诸如child.two之类的语句访问,而第二个成员位于其后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.