Pythonのクラスメソッド()

クラスメソッド()メソッドは、指定された関数のクラスメソッドを返します。

クラスメソッド()メソッドは、クラスメソッド所定の関数に戻ります。
 

クラスメソッドの構文は、()メソッドは、次のとおりです。

classmethod(function)

  

新しいPythonのバージョンでは、あなたが使用できるようにクラスメソッドは、()非Python的に考えられている  @classmethod クラスメソッド定義のデコレータを。
クラスメソッド()それは非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で再現

おすすめ

転載: blog.csdn.net/weixin_33733810/article/details/93621383