我需要在运行时为方法生成代码。能够运行任意代码并具有文档字符串非常重要。

我想出了一个结合execsetattr的解决方案,这是一个虚拟的示例:

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__

是否有更好/更安全/更惯用的方式获得相同的结果?

最佳答案

基于Theran的代码,但将其扩展为类的方法:
class Dynamo(object): passdef 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 0in dynamo 1

关于python - Python中的动态/运行时方法创建(代码生成),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/533382/

10-13 06:50