Pythonの方法などの方法と静的方法を深く理解します。


前に書く
この数日間の読書量は蜜の量が低くて、何の原因ですか?私もよく分かりませんでした。もしあなた達が私のところに問題があると思ったら、あるいはどこが悪いのか、バックグラウンドやWeChatで教えてください。先に感謝しました。
昨日の文章は詳しくて解凍方法のバインディング方法と非バインディング方法に方法の中のバインディング方法と非バインディング方法を書いています。今日は残りの「種類の方法」と「静的方法」を学びに来ました。
クラス方法&静的方法
始まる前に、まず次のコードを見せてください。

class Sample:
 language = "C++"
 def __init__(self):
 self.language = "python"

def get_class_attr(cls):
 return cls.language

if __name__ == "__main__":
 print("sample.language:",Sample.language)
 r = get_class_attr(Sample)
 print("get class attribute:",r)
 f = Sample()
 print("instance attribute:",f.language)
上記のコードはクラスSampleにおいて、一つの属性langage="C+"を定義しています。これは「クラス属性」です。初期化方法では、self.langage=「python」が定義されており、これは「インスタンス属性」である。
これを知ったら、関数get_を分析します。クラスatr(cls)は、この関数ではパラメータがclsであり、関数体から見ると、参照を要求するオブジェクトは属性langageを持つべきであり、この説明は、どのオブジェクトでも自由にできるものではない。巧妙なのは、前に定義されたクラスSampleにlangageという属性があるので、この関数を呼び出した時に、直接にこのクラスのオブジェクトを方法としてget_クラスatr()のパラメータです。
Sample.langageはクラス属性の値を得るために、get gauです。クラスatr(Sample)はクラスSampleの属性Sample.langguageの値を返しますので、上記の例では前の2つのprint関数で印刷した結果は同じです。
f=Sample()は、インスタンスを作成し、f.langageを介してインスタンス属性にアクセスする。上記のコードに対する運転結果は以下の通りです。

sample.language:C++
get class attribute:C++
instance attribute:python
上記の説明を経て分かりましたか?もし分からなかったら、上記の運行結果と分析の過程を詳しく比較してください。
上記の例では、比較的特殊な関数はget_であるべきです。クラスatr(cls)はクラスの外に書いてありますが、この関数は前に書いた種類のオブジェクトを呼び出すしかありません。すべてのオブジェクトにはその特別なlanguage属性がありません。この関数は外に書いておくと後期のメンテナンスに不利です。このような状況の発生を避けるべきです。避ける方法は関数とクラスを一緒に書くことです。ですから、次のような書き方があります。

class sample:
 language = "C++"
 def __init__(self):
 self.language = "python"

 @classmethod
 def get_class_attr(cls):
 return cls.language

if __name__ == "__main__":
 print("sample.language:",sample.language)
 r = sample.get_class_attr()
 print("get class attribute:",r)
 f = sample()
 print("instance attribute:",f.language)
 print("instance get_class_str:",f.get_class_attr())
上のこの修正コードの中に@classimethodが現れました。これは装飾器です。関数の部分で述べました。ここで注意したいのは、@classimethodが装飾した方法のパラメータの中で、最初のパラメータはselfではなく、これは私たちが一般的に認識しているクラスの方法とは違います。ここではパラメータclsを使っています。これは習慣の書き方です。もちろん他のものを使ってもいいです。運行の結果を見てみましょう。
sample.langage:C++
get class atribute:C++
instance atribute:python
instance get_クラスstr:C++
上記の運転結果から、クラスまたはインスタンスを通してget_を実行することが分かります。クラスatr()によって得られた結果はクラス属性の値です。これは装飾器@classimethodが装飾した方法を説明しています。パラメータclsはクラスオブジェクトSampleを参照します。
これで、「種類の方法」の定義が出てきます。種類の方法とは、種類の中で定義される方法です。この方法は装飾器@classimethodによって飾られています。その最初のパラメータclsはこの種類のオブジェクトを参照しています。
種類の方法を知ったら、同じ考えで別の方法の「静的方法」を理解できます。まずコードを見ます。

import random

def judge(n):
 num = random.randint(1,100)
 return num - n > 0

class Sample:
 def __init__(self,name):
 self.name = name

 def get_name(self,age):
 if judge(age):
  return self.name
 else:
  return "the name is stupid"

if __name__ == "__main__":
 s = Sample('rocky')
 name = s.get_name(23)
 print(name)
先に上のコードを見てください。種類のSampleには外の関数judge(n)が使われています。この種類と関数の関係も互いに関連していますので、後期のプログラムのメンテナンスに問題があるかもしれません。メンテナンスのために同じようにプログラムを修正しました。

import random

class Sample:
 def __init__(self,name):
 self.name = name

 def get_name(self,age):
 if self.judge(age):
  return self.name
 else:
  return "the name is stupid"
 @staticmethod
 def judge(n):
 num = random.randint(1,100)
 return num - n > 0

if __name__ == "__main__":
 s = Sample('rocky')
 name = s.get_name(23)
 print(name)
同様に修正して最適化して、元のクラス外の関数をクラスの中に入れました。しかし、これは簡単な移動ではなく、関数の前に@staticmethodの装飾器を追加します。この関数はクラスの中にありますが、他の方法とは違って、最初のパラメータもselfではありません。私たちが使用するときは、インスタンスを通じて呼び出すことができます。たとえばsample.select(n)です。
上記の手順から、judge(n)はクラスの中にありますが、確かに独立した方法であり、クラス自体とは関係なく、前に述べた後期メンテナンス上のトラブルを免除するためだけです。しかし、それは存在する道理があります。上の例は典型的な説明です。
したがって、「静的方法」の定義も出てきます。クラスの作用領域には、前に@staticmethodの装飾器を加えなければならないので、この方法を静的方法と名づけます。
後に書く
方法はクラスの重要な構成部分であり、本章で述べた種類の方法と静的な方法によって、クラスを使う時に便利なツールができます。
「方法」のこの部分はここで補足しました。その後もOOPの残りの2つの特徴を学びます。「多態」と「カプセル化」を楽しみにしてください。
もしあなたがこの文章があなたに収穫があると感じたら、歓迎して転送してください。あなたのサポートは私のコードワードの最大の動力です。いつまでも道で分かち合います。一緒に頑張ります。
The end
以上はPython方法などの方法と静的方法の詳細を深く理解しました。python類の方法と静的方法についての資料は他の関連記事に注目してください。