[自问这个问题后,我发现: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的输出。)
答案 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