メモ
- 渋日記: Pythonクックブック2nd 6.10をPython3.0に移植してみた (http://blog.shibu.jp/article/29437040.html)
2.Xと3.Xではメソッド呼び出しはそれぞれ以下のように解釈されます。
# Python2.X m.im_func(m.im_self, arg_1, arg_2, arg_3) # Python3.X m.__func__(m.__self__, arg_1, arg_2, arg_3)
インスタンスメソッドを自前で作るやり方もそれぞれ以下のように変わります。Python 2.Xではインスタンスになる前のクラスに属している段階のメソッドは非束縛メソッド(UnboundMethodType)という型ですが、Python3.Xでは通常の関数(FunctionType)です。非束縛メソッドと違い、所属するクラス(3番目のパラメータ)を持たなくなっていますが、そのあたりの経緯はThe History of Pythonにちょっと書かれています。インスタンス化されるときに型が変わってメソッド(MethodType)になります。
# Python2.X method = new.instancemethod(m.im_func, m.im_self, m.im_class) # Python3.X method = types.MethodType(m.__func__, m.__self__)
非束縛メソッドがなくなってしまったので、クラスの状態で、メソッドかstaticメソッドかの区別がつかなくなってしまいました。@staticmethodデコレータを付けるとstaticになりますので、何か違いは記録されているはずなんですけどね。ソースコードをみて、staticmethodというモノが関数ではなくてクラスということは突き止めたけど、それ以上はまだ分かってません。