繁体   English   中英

ctypes.Structure在运行时修改_fields_

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM