Существует способ, который я обнаружил, используя пространство привязки 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 объекта похож на внутренний словарь атрибутов, к которому можно получить доступ через. команды, он делает объект 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.'
Эта функция существенно упрощает разделение списков вместе, чтобы создать набор атрибутов для объекта экземпляра.
Кроме того, я написал сообщение в блоге об этой теме в python: https://creatism.wordpress.com/2015/10/26/creating-function-and-class-objects-in-python/ –