このサイトについて

staticmethodがなかったらやっぱ困る

staticmethodがなかったらやっぱ困る

僕は,これまでいくつかstaticmethodを作ったことがある。メソッドの実行にインスタンスもクラスオブジェクトも必要ないけど,名前空間的にと言うか,コードの書き方的に,そのクラスに関する処理であることを明示したいときに使う。

実際,Google Code Searchあたりで「python staticmethod」と検索すると沢山実例が出てくる。

たとえば,twitter.pyなどではStatusクラスのNewFromJsonDict()メソッドがstaticmethodになっている。jsonのデータをStatusクラスのインスタンスとして返す処理を実行しているメソッドで,メソッド内部ではインスタンスも要求しない(というか新しいStatusインスタンスを返すことが目的のメソッドなのだ)し,クラスオブジェクトすら要求しない(Statusクラスのインスタンスを生成することは自明)。NewFromJsonDict()はclassmethodとしても実装できるけど,メソッド内部で使うクラスが自明なので,classmethodにしてわざわざ引数にクラスを渡すのは冗長と言える。

staticmethodを使うことによる利点はいくつか考えられる。

  • 「status=Status.NewFromJsonDict()」というように,「Statusクラスのインスタンスをjsonの辞書から作るよ」というような明示的なコードを書くことができる
  • Userというような同種のクラスがあった場合,このクラスにも「NewFromJsonDict()」という,同様に機能するstaticmethodがあることが類推しやすい

他にもstaticmethodを使うべきケースやパターンはあると思う。

2010-08-27 04:54