Python での動的/ランタイムメソッド作成 (コード生成) 質問する

Python での動的/ランタイムメソッド作成 (コード生成) 質問する

実行時にメソッドのコードを生成する必要があります。任意のコードを実行でき、ドキュメント文字列を持つことができることが重要です。

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__

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

ベストアンサー1

Theran のコードに基づいていますが、クラスのメソッドに拡張されています。



class Dynamo(object):
    pass

def add_dynamo(cls,i):
    def innerdynamo(self):
        print "in dynamo %d" % i
    innerdynamo.__doc__ = "docstring for dynamo%d" % i
    innerdynamo.__name__ = "dynamo%d" % i
    setattr(cls,innerdynamo.__name__,innerdynamo)

for i in range(2):
    add_dynamo(Dynamo, i)

d=Dynamo()
d.dynamo0()
d.dynamo1()


次のように印刷されます:


in dynamo 0
in dynamo 1

おすすめ記事