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