动态地向Python类添加方法

时间:2015-08-04 18:37:06

标签: python lambda setattr

我有一个班级词典:

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

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

0 个答案:

没有答案