如何为所有ctype结构类设置__str__方法?

时间:2011-01-10 00:25:17

标签: python ctypes

[自问这个问题后,我发现:http://www.cs.unc.edu/~gb/blog/2007/02/11/ctypes-tricks/给出了一个很好的答案。]

我刚为ctype生成的Structure类'foo'写了一个__str__方法,因此:

def foo_to_str(self):
  s = []
  for i in foo._fields_:
    s.append('{}: {}'.format(i[0], foo.__getattribute__(self, i[0])))
  return '\n'.join(s)

foo.__str__ = foo_to_str

但这是为任何Structure类生成__str__方法的一种相当自然的方法。如何将此方法直接添加到Structure类中,以便ctypes生成的所有Structure类都可以获取它?

(我使用h2xml和xml2py脚本自动生成ctypes代码,这没有提供更改类输出名称的明显方法,因此只需子类化Structure,Union& c。并添加我的{{1方法会涉及后处理xml2py的输出。)

1 个答案:

答案 0 :(得分:1)

不幸的是没有这样的方法。尝试修改Structure类本身会导致

TypeError: can't set attributes of built-in/extension type '_ctypes.Structure'

你可以得到的最接近的是一个包装器类,你可以将它自己应用到你关心的每个返回结构,它将非重写方法委托给包装结构。像这样:

class StructureWrapper(object):
    def __init__(self, structure):
        self._ctypes_structure = structure
    def __getattr__(self, name):
        return getattr(self._ctypes_structure, name)
    def __str__(self):
        # interesting code here