Pythonのstatic(静的)メソッドの使い方や呼び出しを解説する

スポンサーリンク

この記事では、Pythonのstatic(静的)メソッドの使い方や呼び出しを解説していきます。

スポンサーリンク

Pythonのstaticメソッドの概要

  • PythonのstaticメソッドはClassの中で使う
  • staticメソッドは、オブジェクトの状態を変更できない。

    Pythonでstaticメソッドを作成する方法

    Pythonでは、静的メソッドを作成する方法が2つあります。

  1. staticmethod() メソッド
  2. 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と表示

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)
タイトルとURLをコピーしました