Python のクラスメソッドと静的メソッド

この記事では、基本的なことについて説明します クラスメソッドと静的メソッドの違い Python と クラスメソッドと静的メソッドをいつ使用するか パイソンで。

Pythonのクラスメソッドとは何ですか?

@classmethod デコレータは、関数の定義後に評価される式である組み込み関数デコレータです。その評価の結果は、関数定義に影を落とします。あ クラスメソッド インスタンスメソッドがインスタンスを受け取るのと同じように、クラスを暗黙の最初の引数として受け取ります。

構文 Python クラス メソッド:

 class C(object):  @classmethod  def fun(cls, arg1, arg2, ...): .... fun: function that needs to be converted into a class method returns: a class method for function. 
  • クラスメソッドは、 クラス クラスのオブジェクトではありません。
  • これらは、オブジェクト インスタンスではなくクラスを指すクラス パラメーターを受け取るため、クラスの状態にアクセスできます。
  • クラスのすべてのインスタンスに適用されるクラス状態を変更できます。たとえば、すべてのインスタンスに適用されるクラス変数を変更できます。

Pythonの静的メソッドとは何ですか?

静的メソッドは暗黙の最初の引数を受け取りません。静的メソッドは、クラスのオブジェクトではなくクラスにバインドされるメソッドでもあります。このメソッドはクラスの状態にアクセスしたり変更したりすることはできません。このメソッドがクラス内に存在するのは理にかなっているため、クラス内に存在します。

構文 Python 静的メソッド:

 class C(object):  @staticmethod  def fun(arg1, arg2, ...):  ... returns: a static method for function fun. 

クラスメソッドと静的メソッド

Class メソッドと静的メソッドの違いは次のとおりです。

  • クラス メソッドは最初のパラメータとして cls を受け取りますが、静的メソッドは特定のパラメータを必要としません。
  • クラス メソッドはクラスの状態にアクセスしたり変更したりできますが、静的メソッドはクラスの状態にアクセスしたり変更したりすることはできません。
  • 一般に、静的メソッドはクラスの状態について何も知りません。これらは、いくつかのパラメータを受け取り、それらのパラメータに基づいて動作するユーティリティ タイプのメソッドです。一方、クラスメソッドにはパラメータとしてクラスが必要です。
  • Python で @classmethod デコレータを使用してクラス メソッドを作成し、@staticmethod デコレータを使用して Python で静的メソッドを作成します。

クラスまたは静的メソッドをいつ使用するか?

  • ファクトリ メソッドを作成するには、通常、クラス メソッドを使用します。ファクトリ メソッドは、さまざまなユースケースのクラス オブジェクト (コンストラクターに似た) を返します。
  • 通常、ユーティリティ関数を作成するには静的メソッドを使用します。

クラスメソッドと静的メソッドを定義するにはどうすればよいですか?

Python でクラス メソッドを定義するには @classmethod デコレータを使用し、静的メソッドを定義するには @staticmethod デコレータを使用します。
両方の違いを理解するために例を見てみましょう。クラス Person を作成するとします。現在、Python は C++ や Java のようなメソッドのオーバーロードをサポートしていないため、クラス メソッドを使用してファクトリ メソッドを作成します。以下の例では、クラス メソッドを使用して、誕生年から人物オブジェクトを作成します。

上で説明したように、静的メソッドを使用してユーティリティ関数を作成します。以下の例では、静的メソッドを使用して、人が成人かどうかを確認します。

簡単な例を 1 つ示します。

クラスメソッド:

Python3




class> MyClass:> > def> __init__(> self> , value):> > self> .value> => value> > def> get_value(> self> ):> > return> self> .value> # Create an instance of MyClass> obj> => MyClass(> 10> )> # Call the get_value method on the instance> print> (obj.get_value())> # Output: 10>

出力

10 

静的メソッド:-

Python3




class> MyClass:> > def> __init__(> self> , value):> > self> .value> => value> > @staticmethod> > def> get_max_value(x, y):> > return> max> (x, y)> # Create an instance of MyClass> obj> => MyClass(> 10> )> print> (MyClass.get_max_value(> 20> ,> 30> ))> print> (obj.get_max_value(> 20> ,> 30> ))>

出力

30 30 

以下は完全な実装です

Python3




# Python program to demonstrate> # use of class method and static method.> from> datetime> import> date> class> Person:> > def> __init__(> self> , name, age):> > self> .name> => name> > self> .age> => age> > # a class method to create a Person object by birth year.> > @classmethod> > def> fromBirthYear(> cls> , name, year):> > return> cls> (name, date.today().year> -> year)> > # a static method to check if a Person is adult or not.> > @staticmethod> > def> isAdult(age):> > return> age>>> 18> person1> => Person(> 'mayank'> ,> 21> )> person2> => Person.fromBirthYear(> 'mayank'> ,> 1996> )> print> (person1.age)> print> (person2.age)> # print the result> print> (Person.isAdult(> 22> ))>

出力:

21 25 True 

補助スペース: ○(1)