python - 如何在类初始化期间添加在字符串中编码的动态方法?

标签 python methods dynamic

我正在为进化算法开发一个代理类。我需要向其中添加一个从父级继承的字符串生成的方法。 这是一个最小的例子

class Agent:
    def __init__(self, s='\tif x > y:\n\t\treturn 1'):
        self.f_template = f'def f(self, x,y):\n{s}'

我希望方法 self.f(self, x,y)self.f_template 作为函数体。 我知道我可以稍后添加它:

A = Agent()
exec(A.f_template)
A.f = partial(f, A)

>>> A.f(3,2)
1

但是是否可以在 __init__() 期间而不是之后实现相同的效果?

简单地执行以下操作会引发NameError:名称'f'未定义

class Agent:
    def __init__(self, s='\tif x > y:\n\t\treturn 1'):
        self.f_template = f'def f(self, x,y):\n{s}'

        exec(self.f_template)
        self.f = partial(f, self)

最佳答案

这是因为 Python 编译器在确定哪些变量是局部变量时会查看代码块中的所有左值,在这种情况下,f 未定义为 l- value,因此编译器在编译时而不是在运行时提示。这在 REPL 中不是问题,因为每一行都是单独编译的。

您可以使用 locals() 字典来访问动态生成的变量名称:

class Agent:
    def __init__(self, s='\tif x > y:\n\t\treturn 1'):
        self.f_template = f'def f(self, x,y):\n{s}'
        exec(self.f_template)
        self.f = partial(locals()['f'], self)

关于python - 如何在类初始化期间添加在字符串中编码的动态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52579310/

相关文章:

c# - 为什么 RazorEngine 会动态编译带有匿名类型模型的模板?

java - 如何使 "jfreecharts"的绘图更加动态?

java - 为什么 instanceof 有时似乎在静态泛型函数中工作?

python - 可以在脚本中禁用 python breakpoint() (使用 VSCode 调试器)吗?

python - Matplotlib 副标题打印旧标题

python - 在 Python 中将整数转换为字符串

java显示方法

java - 字符串比较是否相等

c# - TinyMCE 在动态添加受影响的文本区域后使用

Python 导入模块在提示符下有效,但在脚本中无效