我正在尝试创建一个动态结构类。 ctypes结构的问题在于,在初始化结构或设置 fields 时会发生最终化过程。
在ctypes来源的test scripts我发现了这个:
结构/联盟课程必须完成'迟早,当其中一件事发生时:
- _fields _ 已设置。
- 创建了一个实例。
- 该类型用作另一个Structure / Union的字段。
- 类型是子类
醇>完成后,不再允许分配字段。
结构用于函数指针。在Structure的子类中,我已经定义了辅助函数,它们填充一个临时数组(不是 _fields _ ),其值应最终在 _fields _变量中。
这将允许我的脚本的用户创建一个结构,而无需使用类似的东西对其进行子类化:
class Sub (Structure)
_fields_ = [
(<func_name>, CFUNCTYPE(<res>,<*args>)),
(...),
]
Sub(CFUNCTYPE(<res>, <*args>)(<func_impl>), ...)
但改为使用:
class Sub(function_struct):
pass
Sub.addFunction(...)
Sub(<func_impl>)
在我的子类的init函数中,我设置了 _fields _属性,该属性应该最终确定类型。但是,__ init__函数中添加的字段不会显示为属性。给我'Sub' object has no attribute '<func_name>'
我怀疑子类已经在__init__调用之前完成,无论是通过列表的#2还是#4。
有没有什么方法可以解决最终定稿问题或者延迟它以便我动态设置 _fields _属性?
答案 0 :(得分:0)
我通过制作工厂课程解决了我的问题。
factory = structFactory()
factory.addFunction(<name>, <rtype>)
# Also redefines the __init__ function before returning the type
structType = factory.getType()
struct = structType(<impl>)
也可以使用ctypes.cast
和structType.from_address
从内存地址创建结构。