2011-01-10 5 views
3

[この質問をしているので、私が見つけた:。http://www.cs.unc.edu/~gb/blog/2007/02/11/ctypes-tricks/良い答えを与える]すべてのctype構造クラスに対して__str__メソッドを設定するにはどうすればよいですか?

私はちょうどこれのctype-生成された構造クラスの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 

しかし、これは構造クラスに対して__str__メソッドを生成するかなり自然な方法です。このメソッドを直接Structureクラスに追加すると、ctypesによって生成されたすべてのStructureクラスがそれを取得できるようになりますか?

(私は自動生成ctypesのコードにh2xmlとxml2pyスクリプトを使用していますが、これはクラス出力の名前を変更する明白な方法を提供しないので、単にサブクラス化構造、連合& Cを。そしてそこに私__str__メソッドを追加しますxml2pyの出力を後処理する必要があります)。

+0

悪ハックは、 'xml2py'出力と同じディレクトリに' ctypes.py'というファイルを作成しますが、実際の 'ctypes'モジュールからすべてをインポートし、'構造を上書きするだろう'あなた自身のバージョンで。しかし、これで私を引用しないでください... –

+0

fooとは何ですか?インスタンスまたはクラス? –

+0

はい、これは難しいです。 'TypeError:組み込み/拡張の型の属性を設定できません '_ctypes.Structure''は私を悩ませていました。私は通常のPythonクラスでそれを行うことができますが、私はctypeのことについては十分に分かりません。おそらくデコレータやメタクラスでできることがありますか? –

答えて

1

残念ながら、このような方法はありません。

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

あなたが得ることができる最も近い自体が結果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 
関連する問題