🔨

Pythonでclassを使う:method編(2): staticmethod

2022/12/08に公開

本記事はstaticmethodを啓発する記事です。
まずは以下のclassを考えます。

class A:
    def __call__(self):
        return self.__class__.__name__
    
    # bad code
    def print_fuga(self):
        print('fuga')
	
   # good code 
    @staticmethod
    def print_hoge():
        print('hoge')

上記クラスのメソッドをインスタンスに注目して簡単に説明します。

  1. __call__:自身のインスタンスにはアクセスできる。自身のインスタンスのクラス名を返す。
  2. print_fuga:自身のインスタンスにはアクセスできる。インスタンスと無関係なfugaを出力。
  3. print_hoge:自身のインスタンスにアクセスできない。インスタンスと無関係なhogeを出力。

ここで注目すべきは2と3であり、2のメソッドは明らかに自身のインスタンスにはアクセスできる必要性がありません。

メモリの観点からも無駄で、2は引数にselfが入ってるのに使っていないため冗長です。
またメソッドの中身が長くなってくると、個人的には「いつselfをメソッドで使うんだ?結局使わないのか。。。。」となるのでプログラムも読むお気持ちにも悪いです。(これは自分だけかも)

おそらく以下の関数funcは、多くの人が抵抗があると思うのでわかってもらえるはずです。

def func(a = 1): #使わない引数a
    print('hoge')

これを機に、self(もしくはcls)にアクセスする必要がない関数のメソッドには以下のようにデコレータ@staticmethodを用いて、self(もしくはcls)にアクセスしないことを明示的にしましょう!!

class A:
    @staticmethod
    def print_hoge():
        print('hoge')

Discussion