我有一本类词典:
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
知道发生了什么,以及如何解决它?