2011-01-10 22 views
3

[既然問這個問題,我發現:http://www.cs.unc.edu/~gb/blog/2007/02/11/ctypes-tricks/這給出了很好的答案。]如何爲所有ctype結構類設置__str__方法?

我只是寫了__str__方法爲CTYPE生成的結構類「富」這樣的:

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的代碼,這提供了沒有明顯的方式來改變類輸出的名字,於是乾脆繼承結構,聯盟&角並加入我的__str__方法有將涉及後處理xml2py的輸出。)

+0

一個邪惡的黑客將創建一個名爲`ctypes.py`在同一目錄`xml2py`輸出文件,從現實`ctypes`模塊中導入的一切,覆蓋`結構`用你自己的版本。但不要在這一個引用我... – 2011-01-10 00:38:07

回答

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 
相關問題