python - 在 Python 3 中从字符串定义方法并引用为方法
问题描述
我需要允许用户定义一个处理对象中数据的函数(其中的智慧和安全含义已经在另一个问题中详细讨论过,这里只是重复的评论。)
我希望该功能像任何其他方法一样起作用。那是
def my_method(self):...
将被调用:
obj_handle.my_method()
我几乎在下面实现了这一点,只是需要将结果函数self
作为参数显式传递,而不是像方法典型的那样将其作为第一个参数接收。
p
你可以在我有奇怪self.process(self)
电话的属性中看到这一点。
我想我需要提供一些东西exec
,比如globals()
字典,但我不确定几件事:
- 这个对吗?
- 什么是
globals()
类中的等价物? - 这能解决问题吗?如果不是,我需要做什么?
所以问题是,如何让exec()
定义的函数充当对象的方法?
class test:
def __init__(self, a, b):
self.a=a
self.b=b
@property
def p(self):
return self.process(self)
def set_process(self,program):
func_dict={}
proc_fun = exec(program,func_dict)
setattr(self,'process',func_dict['process'])
def process(self):
return self.a+self.b
t=test(1,2)
prog = '''\
def process(self):
return self.a * self.b
'''
t.set_process(prog)
t.p
解决方案
在上面@juanpa.arrivillaga 的评论中回答:
如果您希望其描述符协议工作并在实例上调用时绑定实例,请在类上设置该函数。所以一个解决方案只是让你的 set_process 成为一个类方法。– juanpa.arrivillaga 1 小时前
工作成果
class test:
def __init__(self, a, b):
self.a=a
self.b=b
@property
def p(self):
return self.process()
@classmethod
def set_process(cls,program):
func_dict={}
proc_fun = exec(program,func_dict)
setattr(cls,'process',func_dict['process'])
def process(self):
return self.a+self.b
t=test(1,2)
prog = '''\
def process(self):
return self.a * self.b
'''
test.set_process(prog)
t.p
推荐阅读
- javascript - 意外字符:没有为此文件配置加载程序 - VUEJS 和 SCSS
- sql - oracle sql根据条件获取数据
- batch-file - 如何使用批处理来修改 .txt 文件中的某些值?
- r - 创建一个列表,其中包含对分类变量的每个响应的数值
- c - '错误,预期的表达式 int',需要一些关于构建我的 c 应用程序的建议
- javascript - 如何在 quickbooks 发票中设置发票日期?
- firebase - 如何访问 Firebase Analytics 的数据受众
- python - 如何使用 Pandas 将带有单引号的嵌套 JSON 展平?
- linkedin - 如何在应用程序链接中设置 r_emailaddress 和 r_fullprofile 等权限
- reactjs - 如何将 console.log 消息从 Firefox/Chrome webbrowser 控制台重定向到终端