我正在使用一些变量(A
)在类(my_name
)中动态添加函数。但是,当我在类(A
中调用函数时,我得到了正确的函数(函数的正确名称),但带有最后一个函数的变量。如何在函数中动态设置变量或如何解决此类问题?
class A:
pass
function_name_list = ['first/function', 'second/function', 'third/function']
def add_method(cls, fnctname):
def decorator(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
return func(*args, **kwargs)
setattr(cls, fnctname, wrapper)
return func
return decorator
def create_functions():
for x in function_name_list:
name = x.replace('/', '')
@add_method(A, name)
def foo(value):
my_name = copy.deepcopy(name)
with open('./file' + str(my_name) + '.txt', 'a') as f:
f.write(str(time.time()) + ',' + my_name + ',' + str(value) + "\n")
print('Call: ', my_name)
a = A()
create_functions()
for x in function_name_list:
name = x.replace('/', '')
getattr(a, '%s' % name)(1)
答案 0 :(得分:1)
在您的create_function
内,def foo()
绑定到变量name
。调用该函数时,它将提取name
的当前值。只有一个name
变量,因此您所有的foo
函数都绑定到同一个变量。
如果您确实要执行此操作,则必须确保每个函数都有一个单独的变量绑定。将for
循环的整个主体拉到一个单独的函数中,然后将为每个函数创建不同的变量。
def create_functions():
for x in function_name_list:
create_foo(x.replace('/', ''))
def create_foo(name):
@add_method(A, name)
def foo(value):
with open('./file' + str(name) + '.txt', 'a') as f:
f.write(str(time.time()) + ',' + name + ',' + str(value) + "\n")
print('Call: ', name)
({copy.deepcopy()
上的{str
将返回原始的str
,因此我将其删除了。)
一种更简单的技术是使用functools.partial
绑定参数:
import functools
def foo(self, value, name):
with open('./file' + str(name) + '.txt', 'a') as f:
f.write(str(time.time()) + ',' + name + ',' + str(value) + "\n")
print('Call: ', name)
def create_functions():
for x in function_name_list:
name = x.replace('/', ''))
setattr(A, name, functools.partial(foo, name=name))