以编程方式分配python类属性时的变量范围

时间:2016-12-19 18:14:13

标签: python scope

最后的答案

我试图修补一个具有以编程方式分配的属性的类,但是我遇到了一个我不知道如何解决的变量范围问题。请参阅以下代码:

class my_obj_class:
    pass
my_obj = my_obj_class()

letters = ['a', 'b']
numbers = [1, 2]

for l in letters:
    for n in numbers:
        attribute_name = "print_" + l + str(n)

        def print_ln(self):
            print(l, n)

        setattr(my_obj_class, attribute_name, print_ln)

my_obj.print_a1()
l, n = "c", 3
my_obj.print_a1()

打印:

b 2
c 3

显然这不正确(print_a1总是打印“a1”)因为print_ln正在打印变量l和n,它们在for循环中发生变化,每个属性使用相同的两个变量。我似乎无法想象如何做到这一点,以便print_a1总是打印“a1”而不是一个变量的值,而不是硬编码每个属性,我显然不想这样做。

ANSWER

是的,感谢您的评论,答案是关闭,这对我来说是新的。 for工作循环如下:

for l in letters:
    for n in numbers:
        attribute_name = "print_" + l + str(n)

        def print_ln(l, n):
            def printer(self):
                print(l, n)
            return printer

        setattr(my_obj_class, attribute_name, print_ln(l, n))

0 个答案:

没有答案