続: クラスに対して動的にメソッドを追加する

そもそも、クラスの名前空間に関数ぶち込めば
そんだけで、済むシンプルで他の言語からしたら変態な
名前空間の持ち主のpythonでは、特別に何のモジュールを
使わなくても出来る。

pythonの名前空間は変態だから - aileron.cc

違うよ、できないよ。昔試してみて失敗したから、間違いない。

・・・と思ってもう一度試してみたら、できちゃった!
間違ってたのは自分のほうだった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 メソッドみたいなものと考えれば、これでもいいのかもしれない。