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属性を使用してインスタンス オブジェクトを作成する別の関数が必要です。オブジェクトのdictは、 を介してアクセスできる属性の内部辞書のようなものです。コマンドを実行すると、JavaScript オブジェクトに似た Python オブジェクトが作成されます。
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.'
この関数は基本的に、インスタンス オブジェクトの一連の属性を作成するために、個別のリストをまとめて圧縮します。