この記事では、Pythonのstatic(静的)メソッドの使い方や呼び出しを解説していきます。
Pythonのstaticメソッドの概要
- PythonのstaticメソッドはClassの中で使う
-
staticメソッドは、オブジェクトの状態を変更できない。
Pythonでstaticメソッドを作成する方法
Pythonでは、静的メソッドを作成する方法が2つあります。
- staticmethod() メソッド
- staticmethod関数デコレータ
1. staticmethod()関数を使う方法
staticmethod()は、クラスで定義された静的メソッドを作成したい場合に便利です。
このメソッドは self 引数を持つべきではないことに注意してください。
class StringUtils:
def to_uppercase(s):
return str(s).upper()
StringUtils.upper = staticmethod(StringUtils.to_uppercase)
print(StringUtils.upper('Python')) # PYTHONと表示
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
2. staticmethodアノテーションを使う方法
上記のstaticmethod()上記のは正直言って良い方法とは言えません。
そこでPythonでstatic関数を使いたい場合は、@staticmethodアノテーションを使った方が良いです。
class MathUtils:
@staticmethod
def multiply(a, b):
return a * b
print(MathUtils.multiply(10 , 5)) # 50と表示
staticmethodアノテーションを使った方が直感的に理解できるコードになっていることが分かります。
Pythonのstaticメソッドとクラスメソッドはどっちを使った方が良いのか?
Pythonにはstaticメソッドの他にクラスメソッドもサポートしていますが、これらは以下の様な違いがあります。
- クラスメソッドはクラス変数にアクセスできるが、スタティックメソッドはクラス変数にアクセスない。
- クラスメソッドを作成するには @classmethod を使用。静的メソッドを作成する場合は、@staticmethodを使用。
class Test:
x = 10
@classmethod
def foo(self):
print(self.x)
@staticmethod
def bar(self):
print(self.x)
実際に上記のコードを書いて、Test.foo()
を実行すると10が出力されますが、Test.bar()
を実行するとTypeError: bar() missing 1 required positional argument: 'self'
のエラー、つまりbarに引数は指定できないとのエラーが返されます。
Pythonのスタティックメソッドとインスタンスメソッドの違いとは?
また、Pythonのstaticメソッドとインスタンスメソッドには以下の違いがあります。
- インスタンスメソッドは、クラス変数だけでなくインスタンス変数にもアクセスできる。
- 静的メソッドは、クラス変数にもインスタンス変数にもアクセスできない。
- インスタンスメソッドの正式なパラメータとして「self変数」が必要。スタティックメソッドには不要。
- 静的メソッドを作るには、@staticmethodアノテーションを使用。インスタンスメソッドには不要。
インスタンスメソッドを使いたい場合は、以下の様に使えばOKです。
class Test:
x = 10
def func(self):
print(type(self))
print(self.x)