methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

ビルダーメソッドを作るときはstaticmethodよりもclassmethodを使おう

Javaだとよくビルダーメソッドをstaticで定義するけど、Pythonの場合はできるだけクラスメソッドを使った方が良いだろう。
例えば、float.fromhex http://docs.python.org/library/stdtypes.html#float.fromhex はクラスメソッドなので、

>>> class Foo(float):
...     pass
...
>>> foo = Foo.fromhex('0x1p-1')
>>> type(foo)
<class '__main__.Foo'>

ビルダーメソッドを子クラスでも利用できる。
もちろん、ビルダーメソッドが子クラスでも妥当であるかどうかは子クラス次第なんだけど、妥当でない場合は子クラスでオーバーライドしたらいいだけの話なので、子クラスでも使えるようにクラスメソッドにしておいて損は無い。