🔨
Pythonでclassを使う:method編(2): staticmethod
本記事は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')
上記クラスのメソッドをインスタンスに注目して簡単に説明します。
-
__call__
:自身のインスタンスにはアクセスできる。自身のインスタンスのクラス名を返す。 -
print_fuga
:自身のインスタンスにはアクセスできる。インスタンスと無関係なfugaを出力。 -
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