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