Ctypes结构化完成

时间:2016-10-25 12:41:24

标签: python python-2.7 struct ctypes

我正在尝试创建一个动态结构类。 ctypes结构的问题在于,在初始化结构或设置 fields 时会发生最终化过程。

在ctypes来源的test scripts我发现了这个:

  

结构/联盟课程必须完成'迟早,当其中一件事发生时:

     
      
  1. _fields _ 已设置。
  2.   
  3. 创建了一个实例。
  4.   
  5. 该类型用作另一个Structure / Union的字段。
  6.   
  7. 类型是子类
  8.         

    完成后,不再允许分配字段

结构用于函数指针。在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 _属性?

1 个答案:

答案 0 :(得分:0)

我通过制作工厂课程解决了我的问题。

factory = structFactory()
factory.addFunction(<name>, <rtype>)

# Also redefines the __init__ function before returning the type
structType = factory.getType() 

struct = structType(<impl>)

也可以使用ctypes.caststructType.from_address从内存地址创建结构。