动态添加类中的函数

时间:2019-04-15 10:35:21

标签: python function dynamic

我正在使用一些变量(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)

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))