【Python】クラスのstaticmethod(静的なメソッド)の書き方【入門第36回】

136, 2019-08-28

目次

クラスのstaticmethodとは?

こんにちは、narupoです。
今回もクラスの機能ですが、staticmethod(スタティック・メソッド)というのをやります。
スタティック(静的)なメソッドでstaticmethodですね。
静的というのはどういうことかと言うと、動的じゃないということです。
動的というのは、たとえばインスタンスを生成するのは動的です。文字列をくっつけたり、変数に入れたりするのは動的といえます。
静的というのはその逆で、最初からそこにあるという状態を表します。
たとえば関数などがそうですね。関数は最初からそこにあります。
それのメソッド版ということですね。

staticmethodについて、具体的には↓を見ていきます。

  • staticmethodの書き方

  • staticmethodの必要性

  • staticmethodと関数の違い

staticmethodの書き方

いきなりですが、staticmethodは↓のように書きます。

class クラス名:
    @staticmethod
    def メソッド名():
        pass

@staticmethodと書いて、あとは普通にメソッドを書くだけです。
1つだけ違うのは、staticmethodには引数selfはいらないということです。

このstaticmethodの特徴ですが、staticmethodクラスをインスタンス化しなくても呼び出せます
実際にやってみましょう。
たとえば↓のようなクラスとstaticmethodがあります。

class Cat:
    @staticmethod
    def say():
        print('にゃーん')

そして↓のようにクラスに直接アクセスしてメソッドを呼び出します

Cat.say()

結果はにゃーんになります。
このようにクラスのstaticmethodは、クラスをインスタンス化しなくてもクラスから直接呼び出すことができます。
これがstaticmethod(静的なメソッド)と呼ばれるゆえんです。

staticmethodの必要性

このstaticmethodですが、いったいどういう使い道が考えられるのでしょうか?
たとえば↓のようなクラス変数を持ったクラスを考えてみましょう。

class Box:
    WIDTH = 4
    HEIGHT = 8

このクラス変数には↓のようにクラスから直接アクセスできます。

Box.WIDTH
Box.HEIGHT

このクラス変数WIDTHHEIGHTを使って、面積を取得したくなったとします。
その場合、↓のように計算します。

Box.WIDTH * Box.HEIGHT

横幅×高さで面積ですね。
これはこれで正解なのですが、この面積の値をいろいろなところで使いたくなった場合、いちいち↑のように書くのは面倒くさいし、コードも冗長になります。
そんな時はstaticmethodの出番です。
staticmethodを使えば、↓のように面積を計算するメソッドを書くことができます。

class Box:
    WIDTH = 4
    HEIGHT = 8

    @staticmethod
    def calc_area():
        return Box.WIDTH * Box.HEIGHT

↑のcalc_areaが面積を計算するメソッドです。
これであとは↓のように書くことができます。

Box.calc_area()

簡単!

calc_areaは、staticmethodでなくて普通のメソッドとして書くことも出来ますが、それは設計上、あまり適当とは言えません。
なぜなら、calc_areaで取得する値がクラスをインスタンス化しなくても取得することができるのであれば、そのcalc_areaは静的であるべきだからです。
静的なデータのみで構成されていて、静的なメソッドとして定義できるのであれば、それは静的なメソッドとして定義すべきだと言えます。
静的であれば、クラスをインスタンス化しなくても呼び出すことができるため、より汎用性が高いからです。

staticmethodの汎用性は、関数とよく似ています。

staticmethodと関数の違い

さきほどのBoxクラスの例だと、たとえば↓のような関数も作ることができます。

def calc_box_area():
    return Box.WIDTH * Box.HEIGHT

これはこれで「面積を取得する」という要件を満たしています。
しかし、この関数とさきほどのcalc_areaメソッドを比べた場合、より適当なのはcalc_areaメソッドのほうです。
なぜなら、calc_areaメソッドはBoxクラスに所属していることがより明確だからです。
calc_areaメソッドはBoxクラスに所属しているため、メソッド名の中にboxなどはいりません。
↓のコードを見た場合、

Box.calc_area()

「ああ、Boxクラスに関係しているメソッドなんだな」
というのが一目でわかります。
よって、関数calc_box_areaと比べるとより所属が明確に、メソッド名が簡便になっていると言えます。

このようにstaticmethodはクラスに所属することで、そのクラスとの関係性を外に伝えることができます。
これがふつうの関数との違いです。
この考え方はネームスペースという概念の考え方に近いですね。名前によって所属を表すことで、よりコードが明確になります。

おわりに

staticmethodはプログラミングをやっているとたまーに使う機能です。
必要な時にひょっこり現れます。

以上、次回に続きます。

また見てね

関連動画



スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク