我有一个班级词典:
classes = { 'cls1' : Class1, 'cls2' : Class2 }
这里Class1,Class2是我定义的Python类,每个类都有方法foo()和bar()。
假设我有另一个名为OtherClass的类。我想迭代上面的字典,并动态地将一些方法添加到OtherClass,如下所示:
for k,v in classes.items():
setattr(OtherClass, 'foo_' + k, lambda x: v().foo())
setattr(OtherClass, 'bar_' + k, lambda x: v().bar())
这会将方法foo_cls1,bar_cls1,foo_cls2和bar_cls2按预期添加到OtherClass。但看起来foo_cls1和bar_cls1的调用分别被调度到foo_cls2和bar_cls2。也就是说,后来添加的方法定义"覆盖"先前添加的(假设字典迭代顺序是cls1,后跟cls2)。为了进一步阐述问题,如果我在上述循环之后执行以下操作:
other = OtherClass()
other.foo_cls2() # Calls Class2.foo() -- Correct
other.foo_cls1() # Also calls Class2.foo() -- Unexpected behavior
other.bar_cls2() # Calls Class2.bar() -- Correct
other.bar_cls1() # Also calls Class2.bar() -- Unexpected behavior
知道发生了什么,以及如何解决它?