49

実行時にメソッドのコードを生成する必要があります。任意のコードを実行し、docstringを使用できることが重要です。

exec私はとを組み合わせた解決策を思いつきました、これsetattrはダミーの例です:

class Viking(object):
    def __init__(self):
        code = '''
            def dynamo(self, arg):
                """ dynamo's a dynamic method!
                """
                self.weight += 1
                return arg * self.weight
            '''
        self.weight = 50

        d = {}
        exec code.strip() in d
        setattr(self.__class__, 'dynamo', d['dynamo'])


if __name__ == "__main__":
    v = Viking()
    print v.dynamo(10)
    print v.dynamo(10)
    print v.dynamo.__doc__

同じ結果を達成するためのより良い/より安全な/より慣用的な方法はありますか?

4

6 に答える 6

-1

私の悪い英語を許してください。

最近、wxPythonで特定のフレームを開くために、各メニュー項目をバインドする動的関数を生成する必要があります。これが私がすることです。

まず、メニュー項目とフレームの間のマッピングのリストを作成します。

menus = [(self.menuItemFile, FileFrame), (self.menuItemEdit, EditFrame)]

マッピングの最初の項目はメニュー項目であり、最後の項目は開くフレームです。次に、各メニュー項目からのwx.EVT_MENUイベントを特定のフレームにバインドします。

for menu in menus:
    f = genfunc(self, menu[1])
    self.Bind(wx.EVT_MENU, f, menu[0])

genfunc関数は動的関数ビルダーです。コードは次のとおりです。

def genfunc(parent, form):
    def OnClick(event):
        f = form(parent)
        f.Maximize()
        f.Show()
    return OnClick
于 2010-03-29T16:51:41.610 に答える