続: クラスに対して動的にメソッドを追加する
そもそも、クラスの名前空間に関数ぶち込めば
pythonの名前空間は変態だから - aileron.cc
そんだけで、済むシンプルで他の言語からしたら変態な
名前空間の持ち主のpythonでは、特別に何のモジュールを
使わなくても出来る。
違うよ、できないよ。昔試してみて失敗したから、間違いない。
・・・と思ってもう一度試してみたら、できちゃった!
間違ってたのは自分のほうだったorz
class Foo(object): pass def f1(self, arg): print repr(arg) obj = Foo() obj.f1("abc") #=> AttributeError: 'Foo' object has no attribute 'f1' Foo.f1 = f1 obj.f1("abc") #=> 'abc'
最近のPythonだとできるようになったのかなと思って、Python2.3で試してみたけど、同じようにうまく動いた。
しかし、代入するだけで function type が instancemethod type に変わるというのは、なんか気持ち悪いな。
print type(f1) #=> <type 'function'> Foo.f1 = f1 # 代入で型が変わる! print type(Foo.f1) #=> <type 'instancemethod'> x = Foo.f1 # でもこれは変わらない print type(x) #=> <type 'instancemethod'>
Foo.f1 = f1 を代入と思うから気持ち悪いと感じるけど、プロパティへの代入は setter メソッドみたいなものと考えれば、これでもいいのかもしれない。