Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのクラスメソッドと静的メソッドの違いを徹底解説


Pythonにおけるクラスメソッド(classmethod)は、クラスのインスタンスではなく、クラスそのものに紐づけられるメソッドです。静的メソッド(staticmethod)もこれと似ていますが、両者にはいくつかの重要な違いがあります。クラスメソッドには@classmethodデコレータを、静的メソッドには@staticmethodデコレータをそれぞれ付与して定義します。

クラスメソッドの構文

class my_class:
    @classmethod
    def function_name(cls, arguments):
        # 関数の処理内容
        return value

静的メソッドの構文

class my_class:
    @staticmethod
    def function_name(arguments):
        # 関数の処理内容
        return value

クラスメソッドでは第一引数にクラス自身を受け取るclsを必ず指定するのが特徴です。一方、静的メソッドには引数に関する特別な決まりはありません。

クラスメソッドと静的メソッドの違い

クラスメソッド 静的メソッド
第一引数として cls(クラス自身)を受け取ります。 特定の引数を受け取りません。
クラスの状態(クラス変数など)にアクセスし、変更できます。 クラスの状態にアクセスすることも変更することもできません。
クラスを引数として受け取ることで、そのクラスの状態を把握できます。 クラスの状態を認識しません。引数を受け取って汎用的な処理を行うために使われます。
@classmethod デコレータを使用します。 @staticmethod デコレータを使用します。

一般的に、静的メソッドはユーティリティ的な補助処理を行う目的で使われ、クラスメソッドはファクトリーメソッドとして活用されます。ファクトリーメソッドを利用すれば、さまざまなユースケースに応じたクラスのオブジェクトを生成して返すことが可能です。

サンプルコード

from datetime import date as dt

class Employee:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod
    def isAdult(age):
        if age > 18:
            return True
        else:
            return False

    @classmethod
    def emp_from_year(emp_class, name, year):
        return emp_class(name, dt.today().year - year)

    def __str__(self):
        return 'Employee Name: {} and Age: {}'.format(self.name, self.age)

e1 = Employee('Dhiman', 25)
print(e1)
e2 = Employee.emp_from_year('Subhas', 1987)
print(e2)
print(Employee.isAdult(25))
print(Employee.isAdult(16))

実行結果

Employee Name: Dhiman and Age: 25
Employee Name: Subhas and Age: 31
True
False

この例では、静的メソッド isAdult() が「年齢が18歳より上かどうか」を判定するユーティリティ関数として機能しています。一方、クラスメソッド emp_from_year() は、誕生年から年齢を計算して Employee オブジェクトを生成・返却するファクトリーメソッドとして動作します。

なお、emp_from_year() の計算には実行時の現在の日付が使われるため、「Subhas」の年齢として出力される値は、プログラムを実行したタイミングによって変化する点に注意してください。

  1. Python Tkinterのafter()メソッドの使い方を徹底解説

    Tkinterは、PythonでGUIアプリケーションを作成するための標準ライブラリです。ウィンドウやボタン、ラベルなどのウィジェットを作成・操作するための組み込みメソッドが多数用意されており、データの表示やGUIイベントの処理を簡単に実装できます。本記事では、その中でも特に便利なafter()メソッドの使い方について、具体的なコード例とともに詳しく解説します。after()メソッドの基本構文.after(delay, FuncName=FuncName)このメソッドは、指定した遅延時間(ミリ秒単位)が経過した後に、引数として渡した関数FuncNameを呼び出します。タイマー処理や定期的な更新

  2. Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説

    本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(