我发现有办法使用 locals() 绑定空间和 exec() 命令。首先,您必须从 exec() 内置函数创建一个函数对象并提取它:
def make_function(name, parameter, commands):
func = 'def {name}({parameter}):'.format(name=name, parameter=parameter)
for line in commands:
func += '\n\t' + line
exec(func)
return locals()[name]
>>> func = make_function('help', 'pay', ['pay+=2', 'pay*=5', 'credit = pay//3', 'return credit'])
>>> func(8)
16
然后,您需要另一个使用dict属性创建实例对象的函数。对象的字典就像它的内部属性字典,可以通过 . 命令,它使 python 对象类似于 javascript 对象。
def create_object(names, values):
assert len(names) == len(values)
exec('class one: pass')
obj = locals()['one']()
for i in range(len(names)):
obj.__dict__[names[i]] = values[i]
return obj
>>> func = make_function('help', 'pay', ['pay+=2', 'pay*=5', 'credit = pay//3', 'return credit'])
>>> test_obj = create_object(['help', 'interest', 'message'], [func, 0.5, 'please pay by thursday.'])
>>> test_obj.help(7)
15
>>> test_obj.interest
0.5
>>> test_obj.message
'please pay by thursday.'
这个函数本质上是把分开的列表压缩在一起,为你的实例对象创建一组属性。