0

我有一本类词典:

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

知道发生了什么,以及如何解决它?

4

0 回答 0