クラスメソッド()メソッドは、指定された関数のクラスメソッドを返します。
クラスメソッドの構文は、()メソッドは、次のとおりです。
classmethod(function)
新しいPythonのバージョンでは、あなたが使用できるようにクラスメソッドは、()非Python的に考えられている
@classmethod
クラスメソッド定義のデコレータを。
@classmethod
デフFUNC(CLS、引数...)
クラスメソッド()パラメータ:
クラスメソッド()メソッドは、単一のパラメータを取ります。
クラスメソッド()メソッドは、単一のパラメータを取ります。
- 機能 -クラスメソッドに変換する必要がある機能
- 機能 - クラスメソッドに変換する機能
クラスメソッドからの戻り値()
クラスメソッド()メソッドは、指定された関数のクラスメソッドを返します。
クラスメソッド()メソッドは、クラスメソッド所定の関数に戻ります。
クラスメソッドとは何ですか?
クラスメソッドは、クラスではなく、そのオブジェクトにバインドされている方法です。それは多くのように、クラスのインスタンスを作成する必要はありません staticmethod。
静的メソッドとクラスメソッドとの間の差です。
- 静的メソッドは、クラスについて何も知らないし、ただのパラメータを扱います
- そのパラメータは常にクラス自身ですので、クラスメソッドはクラスで動作します。
クラスメソッドは、クラスとそのオブジェクトの両方によって呼び出すことができます。
Class.classmethod()
あるいは
クラス()。クラスメソッド()
しかし、どんなクラスメソッドは、常にクラス自体CLSとして最初の引数を持つクラスに添付されていません。
デフクラスメソッド(CLS、引数...)
実施例1:クラスメソッドを使用してクラスのメソッドを作成()
クラスの人: 年齢 = 25 デフprintAge(CLS): 印刷(' 年齢は:' 、cls.age) #printAge作成クラスのメソッドを Person.printAge = クラスメソッド(Person.printAge) Person.printAge() あなたがプログラムを実行すると、出力は次のようになります。 年齢がある:25 歳である:25
ここでは、クラスを持つ Person
メンバ変数で、 年齢 25に割り当てられています。
我々はまた、機能してい printAge
単一のパラメータ取り CLSを していない self
我々は通常かかります。
CLSは 、クラスを受け入れ Person
、パラメータのではなく、人のオブジェクト/インスタンスとして。
今、私たちは、この方法を渡す Person.printAge
関数の引数として classmethod
。それはクラス(すなわち人)として最初のパラメータを受け入れるように、これは、クラスメソッドにメソッドを変換します。
最後の行では、我々は呼んで printAge
私たちは、静的メソッドのために行うようにPersonオブジェクトを作成せず。これは、クラス変数印刷さ 年齢を。
するときは、クラスメソッドを使用していますか?
1.ファクトリメソッド
ファクトリメソッドは異なるユースケースのために(コンストラクタのような)クラスオブジェクトを返すこれらのメソッドです。
C ++でのオーバーロード関数に似ています。Pythonはのような何かを持っていない、ので、クラスメソッドと静的メソッドが使用されています。
例2:クラスメソッドを使用してファクトリメソッドを作成します。
日時インポート日付 #ランダム人の クラスの人: デフ__init __(自己、名前、年齢): self.name = 名前 self.age = 年齢 @classmethod :fromBirthYear(CLS、名前、birthYear)デフ リターン CLS(名前、date.today ().year - birthYear) デフ表示(自己): プリント(self.name + " の年齢は:" + STR(self.age)) 人 =人(' アダム'、19 ) person.display() PERSON1= Person.fromBirthYear(「ジョン」、 1985 ) person1.display()
あなたがプログラムを実行すると、出力は次のようになります。
アダムの年齢は:19 ジョンの年齢は:34
ここで、我々は2つのクラスインスタンスの作成者、コンストラクタと持っている fromBirthYear
方法を。
コンストラクタは、通常のパラメータの取り 名前 と 年齢を。、一方で fromBirthYear
取る クラス、 名前と birthYearを、現在の年でそれを差し引いて現在の年齢を計算し、クラスのインスタンスを返します。
fromBirthYear方法は、第1パラメータとしてPersonクラス(ないPersonオブジェクト)を取り 、CLSと呼び出すことによってコンストラクタを返す cls(name, date.today().year - birthYear)
に相当します、 Person(name, date.today().year - birthYear)
この方法の前に、我々が表示します @classmethod
。これは呼ばれる デコレータを 変換するための fromBirthYear
クラスメソッドとしてクラスメソッドに()。
相続2.正しいインスタンスの作成
あなたはクラスメソッドとしてファクトリメソッドを実装するからクラスを派生するたびに、派生クラスの正しいインスタンスの作成を保証します。
あなたは上記の例のための静的メソッドを作成することができますが、それが作成したオブジェクトは、常に基本クラスとしてハードコーディングされます。
あなたはクラスのメソッドを使用する場合でも、それは、派生クラスの正しいインスタンスを作成します。
例3:クラスメソッドは継承のための仕組み?
from datetime import date
# random Person
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def fromFathersAge(name, fatherAge, fatherPersonAgeDiff):
return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff)
@classmethod
def fromBirthYear(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 = 'Male'
man = Man.fromBirthYear('John', 1985)
print(isinstance(man, Man))
man1 = Man.fromFathersAge('John', 1965, 20)
print(isinstance(man1, Man))
When you run the program, the output will be:
真
偽
ここでは、クラスのインスタンスを作成するための静的メソッドを使用すると、作成中のインスタンスタイプをハードコードために私たちを望んでいます。
継承するとき、これは明らかに問題が発生 Person
します Man
。
fromFathersAge
方法は戻りません Man
オブジェクトが、そのベースクラス Person
のオブジェクトを。
これは、OOPのパラダイムに違反します。クラスメソッドを使用して fromBirthYear
、それがクラス自体ように、第1のパラメータを取得し、そのファクトリメソッドを呼び出すためのコードのOOPらしさを確保することができます。
ます。https://www.cnblogs.com/Xingtxx/p/11045997.htmlで再現