gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:59:20 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com