当前位置: 首页 > 面试题库 >

Python中的动态/运行时方法创建(代码生成)

乐正瑞
2023-03-14
问题内容

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

我想出了一个结合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__

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


问题答案:

基于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


 类似资料:
  • 本文向大家介绍php运行时动态创建函数的方法,包括了php运行时动态创建函数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php运行时动态创建函数的方法。分享给大家供大家参考。具体分析如下: 一般的语言函数必须定义了在运行,而php支持在运行时动态创建函数,下面是一个简单的范例,在运动时根据不同的条件创建函数$a 希望本文所述对大家的php程序设计有所帮助。

  • 本文向大家介绍C#在运行时动态创建类型的实现方法,包括了C#在运行时动态创建类型的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#在运行时动态创建类型的实现方法。是C#项目开发中很实用的技巧。分享给大家供大家参考。具体分析如下: 具体来说,C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的。 主要功能代码如下: 希望本文所述

  • 本文向大家介绍使用python创建生成动态链接库dll的方法,包括了使用python创建生成动态链接库dll的方法的使用技巧和注意事项,需要的朋友参考一下 如今,随着深度学习的发展,python已经成为了深度学习研究中第一语言。绝大部分的深度学习工具包都有python的版本,很多重要算法都有python版本的实现。为了将这些算法应用到具体工程中,这些工具包也提供了不同类型的接口。 动态链接库(.d

  • 问题内容: 我想为我编写的(纯粹是学术性的)玩具语言处理器编写一个非常小的概念验证JIT编译器,但是在中等高度的设计中遇到了一些麻烦。从概念上讲,我熟悉JIT的工作原理- 您将字节码编译为(机器或汇编语言)代码以运行。但是,从细节上讲,我不太 了解 您实际如何 执行 此操作。 我(非常“ newb”)下意识的反应,因为我没有从哪里开始的第一个线索,将尝试执行以下操作: mmap()一个内存块,设置

  • 本文向大家介绍PHP实现动态执行代码的方法,包括了PHP实现动态执行代码的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现动态执行代码的方法。分享给大家供大家参考,具体如下: 这里介绍的PHP动态执行,即在页面上直接输入代码,点击执行,返回执行结果 方法很简单,主要使用了: 函数来实现。 代码如下: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php操作office文

  • 本文向大家介绍Java中的动态方法分派或运行时多态,包括了Java中的动态方法分派或运行时多态的使用技巧和注意事项,需要的朋友参考一下 Java中的运行时多态性是通过方法覆盖实现的,方法覆盖是子类覆盖其父类中的方法。重写的方法本质上隐藏在父类中,除非子类在重写的方法中使用super关键字,否则不会调用该方法。此方法调用解析在运行时发生,称为动态方法分派机制。 示例 让我们来看一个例子。 这将产生以