Pythonのclassmethod()
の クラスメソッド() は Python の組み込み関数であり、指定された関数のクラス メソッドを返します。
Python 構文の classmethod()
構文: クラスメソッド(関数)
パラメータ: この関数は関数名をパラメータとして受け取ります。
戻り値の型: この関数は、変換されたクラス メソッドを返します。
Python classmethod() 関数
classmethod() メソッドは、オブジェクトではなくクラスにバインドされます。クラスメソッドは、クラスとオブジェクトの両方から呼び出すことができます。これらのメソッドは、クラスまたはオブジェクトを使用して呼び出すことができます。
クラスメソッドと静的メソッド
の基本的な違いは、 Python のクラスメソッドと静的メソッド クラスメソッドと静的メソッドをいつ使用するか パイソン 。
- クラス メソッドは最初のパラメータとして cls を受け取りますが、静的メソッドは特定のパラメータを必要としません。
- クラス メソッドはクラスの状態にアクセスしたり変更したりできますが、静的メソッドはクラスの状態にアクセスしたり変更したりすることはできません。
- 一般に、静的メソッドはクラスの状態について何も知りません。これらは、いくつかのパラメータを受け取り、それらのパラメータに基づいて動作するユーティリティ タイプのメソッドです。一方、クラスメソッドにはパラメータとしてクラスが必要です。
- Python では @classmethod デコレータを使用してクラス メソッドを作成し、@staticmethod デコレータを使用して Python で静的メソッドを作成します。
Python のクラスメソッドの例
単純なクラスメソッドを作成する
この例では、Python でクラス メソッドを作成する方法を見ていきます。このために、メンバー変数 course を持つ Geeks という名前のクラスを作成し、オブジェクトを出力する Purchase という名前の関数を作成しました。さて、メソッドを渡しました Geeks.purchase> を使用してクラスメソッドに追加します。 @classmethod> デコレータ。メソッドをクラスメソッドに変換します。クラス メソッドを配置すると、関数オブジェクトを作成せずに、クラス名 Geeks を直接使用して、関数 Purchase を呼び出すことができます。
Python3
class> geeks:> > course> => 'DSA'> > def> purchase(obj):> > print> (> 'Purchase course : '> , obj.course)> geeks.purchase> => classmethod> (geeks.purchase)> geeks.purchase()> |
出力
Purchase course : DSA
classmethod() を使用してクラスメソッドを作成します
この行を作成する前に print_name classmethod を作成しました print_name() これはクラスではなくオブジェクトでのみ呼び出すことができます。このメソッドは classmethod として呼び出すことができます print_name() メソッドはクラスメソッドと呼ばれます。
Python3
class> Student:> > # create a variable> > name> => 'Geeksforgeeks'> > # create a function> > def> print_name(obj):> > print> (> 'The name is : '> , obj.name)> # create print_name classmethod> # before creating this line print_name()> # It can be called only with object not with class> Student.print_name> => classmethod> (Student.print_name)> # now this method can be called as classmethod> # print_name() method is called a class method> Student.print_name()> |
出力
The name is : Geeksforgeeks
クラスメソッドを使用したファクトリメソッド
classmethod() 関数の使用は、オブジェクトではなくクラス名を使用して多くの関数を呼び出すファクトリ デザイン パターンで使用されます。
Python3
# Python program to demonstrate> # use of a 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)> > def> display(> self> ):> > print> (> 'Name : '> ,> self> .name,> 'Age : '> ,> self> .age)> person> => Person(> 'mayank'> ,> 21> )> person.display()> |
出力
Name : mayank Age : 21
クラスメソッドは継承に対してどのように機能するのでしょうか?
この例では、2 つのクラスで Python クラス階層を作成しています。 Person> そして Man> 、クラス メソッドと継承の使用法を示します。
Python3
from> datetime> import> date> # random Person> class> Person:> > def> __init__(> self> , name, age):> > self> .name> => name> > self> .age> => age> > @staticmethod> > def> from_FathersAge(name, fatherAge, fatherPersonAgeDiff):> > return> Person(name, date.today().year> -> fatherAge> +> fatherPersonAgeDiff)> > @classmethod> > def> from_BirthYear(> cls> , name, birthYear):> > return> cls> (name, date.today().year> -> birthYear)> > def> display(> self> ):> > print> (> self> .name> +> ''s age is: '> +> str> (> self> .age))> class> Man(Person):> > sex> => 'Female'> man> => Man.from_BirthYear(> 'John'> ,> 1985> )> print> (> isinstance> (man, Man))> man1> => Man.from_FathersAge(> 'John'> ,> 1965> ,> 20> )> print> (> isinstance> (man1, Man))> |
出力
True False
Python @classmethod デコレータ
@classmethod デコレーターは組み込みです 関数デコレータ これは、関数が定義された後に評価される式です。その評価の結果は、関数定義に影を落とします。インスタンス メソッドがインスタンスを受け取るのと同じように、クラス メソッドは暗黙の最初の引数としてクラスを受け取ります。
クラスメソッドデコレータの構文
クラスC(オブジェクト):
@クラスメソッド
def fun(cls, arg1, arg2, …):
…。
どこ、
- 楽しい: クラスメソッドに変換する必要がある関数
- 戻り値: 関数のクラスメソッド。
注記:
- クラス メソッドは、クラスのオブジェクトではなく、クラスにバインドされるメソッドです。
- これらは、オブジェクト インスタンスではなくクラスを指すクラス パラメーターを受け取るため、クラスの状態にアクセスできます。
- クラスのすべてのインスタンスに適用されるクラス状態を変更できます。たとえば、すべてのインスタンスに適用されるクラス変数を変更できます。
例
以下の例では、staticmethod() と classmethod() を使用して、人が成人かどうかを確認します。
Python3
# Python program to demonstrate> # use of a 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 27 True