バインドされたメソッドとバインドされていないメソッド
クラスで定義された関数は、バインドされたメソッドとバインドされていないメソッドの2つのカテゴリに分類されます。
バインディングメソッドは、オブジェクトにバインドされたオブジェクトメソッドとクラスにバインドされたクラスメソッドに分けられます。
バインド方法:特別なことは、呼び出し元自体が最初のパラメーターとして自動的に渡されることです
#1.オブジェクトにバインドされたメソッド:呼び出し元はオブジェクトであり、オブジェクトは自動的に渡されます。 #2 . クラスにバインドされたメソッド:呼び出し元クラス、自動的に渡されたクラスは
通常クラスで定義される関数はデフォルトでオブジェクトにバインドされ、デコレータ@classmethodを関数に追加した後、関数はクラスにバインドされます。
前の章ではすでにオブジェクトメソッドを紹介しましたが、このセクションでは主にクラスメソッドを紹介します。クラスメソッドは通常、__ init__に基づいてインスタンスを初期化する追加の方法を提供するために使用されます
例1:
#のプロファイルsettings.pyの内容 HOST = ' 127.0.0.1 ' PORT = 3306 #のアプリケーションクラスメソッドのインポート設定のクラスのMySQL: DEF __init__ (セルフ、IP、ポート): self.ip = IP self.port = ポートDEF FUNC (自己): 印刷(' %S:%S '%(self.ip、self.port)) @classmethod #飾られたクラスのメソッドにバインドされた以下の機能DEFの from_conf(CLS): #設定ファイルから読み取り設定の初期化#印刷(CLS)のリターンを cls(settings.IP、settings.PORT) #==> Mysql(settings.IP、settings.PORT)そしてそれを初期化のためにinitに渡します #obj1 = Mysql( '1.1.1.1'、3306) obj2 = Mysql.from_conf() #クラスのメソッドを呼び出して、クラスが自動的にMySQLのCLSのよう最初のパラメータに渡された 印刷(OBJ2。__dict__ ) 印刷(obj2.ip、obj2.port) '' ' {' IP ':' 127.0.0.0 'を、'ポート':3306} 127.0.0.0 3306 ' ''
例2:
クラスData_test2(オブジェクト): デイ = 0 ヶ月 = 0 年 = 0 DEF __init__(セルフ、0 =年、月= 0、デイ= 0): self.day = デイ self.month = 月 self.year = 年 @classmethod DEF get_date(CLS、string_dateは): #現在のクラス名と呼ばれる最初のパラメータはCLSで表し、 年、月、日の地図=(int型、string_date.split(' - ' )) 日付1 = CLS(年、月、日) #返されるのは初期化されたクラスです。 戻り値date1 def out_date(self): print(" year:" 、self.year) print(" month:" 、self.month) print(" day:" 、self.day) r = Data_test2.get_date(" 2016-8-6 " ) r.out_date() '' ' 年:2016 月:8 日:6 ' ''
クラスにバインドされたメソッドはクラス専用ですが、実際にはオブジェクトも呼び出すことができますが、自動的に渡される最初のパラメーターはクラスのままです。つまり、そのような呼び出しは意味がなく、混乱を招きやすいこれは、Pythonのオブジェクトシステムと他のオブジェクト指向言語オブジェクトシステムの違いの1つでもあります。たとえば、SmalltalkやRubyでは、クラスにバインドされたメソッドは、オブジェクトにバインドされたメソッドから厳密に分離されています。
バインドされていないメソッド:
デコレーター@staticmethodをクラスの関数に追加すると、その関数は非バインドメソッド(静的メソッドとも呼ばれます)になります。このメソッドはクラスまたはオブジェクトにバインドされていません。クラスとオブジェクトの両方がそれを呼び出すことができますが、これは単なる通常の関数であるため、値を自動的に渡すことはありません。
#にバインドするために失敗した人:呼び出し側は、クラス、オブジェクトであり、高麗人参の効果のない自動転送はありません
クラスのMySQL: DEF __init__ (セルフ、IP、ポート): self.nid = self.create_id() self.ip = IP self.port = ポート @staticmethod #静的メソッドとして飾られ、次の機能 DEF CREATE_IDを(): インポートUUID 戻りuuid.uuid4() OBJ1 = MySQLの(' 1.1.1.1 '、3306 ) #の静的メソッド、または関数呼び出しのためのオブジェクト・クラスのためには、 #(Mysql.create_id)#<関数Mysql.create_id AT 0x0000022D50E237B8>印刷 #print(obj1.create_id)#<function Mysql.create_id at 0x0000022D50E237B8> #Mysql.create_id(1,2,3)#クラスまたはオブジェクトは関数であるため、create_id関数にはいくつかのパラメーターが必要で、いくつかのパラメーターを渡す必要があります #obj1 .create_id(4、5、6) 印刷(Mysql.create_id())
要約すると、未結合の結合方法を使用する方法:クラスが実装コードは、その機能が必要な場合、オブジェクトのために使用されるオブジェクトのメソッドとして定義され、使用することで、クラスのクラスメソッドとして定義される、を参照することなくクラスまたはオブジェクトは、それらを静的メソッドとして定義します。