pythonアクセラレータ、クラスメソッド、静的メソッド、アクセス制御

18150 ワード

pythonオブジェクト向けプログラミング
  • デコレーション
  • クラスメソッド
  • 静的方法
  • アクセス制御
  • デコレーション
    ある関数について、結果として、その関数コードを変更することなく、その関数に追加の機能を追加することを望んでいる場合は、装飾器を使用して関数を装飾することができます.
    def add(a,b):
    	notice
    	pass
    
    def subt(a,b):
    	notice
    	pass
    
    def multi(a,b):
    	notice
    	pass
    
    def divi(a,b):
    	notice
    	pass
    

    アクセラレータは1つの関数で、アクセラレータは1つの関数をパラメータ(入力された実パラメータは修飾された関数)として受け取ります.アクセラレータの内部ネストは別の関数を定義します.内部関数ではアクセラレータのパラメータが参照されます.アクセラレータの戻り値は、内部関数が任意のタイプのパラメータを受信するために、内部関数のパラメータを(*args,**kwargs)と定義します.まず、装飾された関数に追加された新しい機能を完了し、装飾された関数を呼び出します.デコレーションをデコレーションに適用する文法は、デコレーション関数の前に「@デコレーションの関数名」を追加することです.
    def notice(func):
    	def wrapper(*args, **kwargs):
    		print("  :     ,    !")
    		print("*************************")
    		return func(*args,**kwargs)
    	return wrapper
    
    @notice   #add = notice(add)
    def add(a,b):
    	return a + b
    
    @notice
    def subt(a,b):
    	return a - b
    
    @notice
    def multi(a,b):
    	return a * b
    
    @notice
    def divi(a,b):
    	if b != 0:
    		return a / b
    
    print(add(3,5))
    #   :
    #  :     ,    !
    #************************
    #8
    

    クラスメソッドとは、クラスオブジェクトにデコレーション@classmethodを使用してデコレーションする方法です.クラスオブジェクトでクラスメソッドを定義する場合は、アクセラレータ@classmethodを使用して装飾する必要があります.また、最初のパラメータはクラスオブジェクトを表し、対応する実パラメータはシステムによって自動的に入力されます.最初のパラメータの名前は通常clsであるもよいし、他の名前のクラスメソッドがクラスオブジェクトによって呼び出されてもよいし、構文フォーマットはクラスオブジェクトである.メソッド名([実パラメータ])または:cls.メソッド名([実パラメータ])クラスメソッドは、インスタンスオブジェクトによって呼び出すこともできる、構文フォーマットは、インスタンスオブジェクトである.方法名([実参]).メソッド名([実パラメータ])クラスオブジェクトのすべてのインスタンスオブジェクトには、クラスオブジェクトへのポインタがあるため、クラスオブジェクトのすべてのインスタンスオブジェクトは、クラスオブジェクトで定義されたクラスメソッドを呼び出すことができます.クラスメソッドを呼び出すと、クラスオブジェクトが実パラメータとして最初のパラメータに自動的に渡されます.1番目の実パラメータは2番目のパラメータに渡され、2番目の実パラメータは3番目のパラメータに渡され、順番に類推されます.
    class MyClass(object):
    	#          
    	@classmethod
    	def class_func_1(cls, a, b):
    		print(a, b)
    
    	#           
    	@classmethod
    	def class_func_2(cls):
    		MyClass.class_func_1(1,2)
    		#or
    		cls.class_func_1(1,2)
    
    	#           
    	def ins_func(self):
    		self.clss_func_1(1,2)
    

    クラスメソッド
    クラスメソッドとは、クラスオブジェクトにデコレーション@classmethodを使用してデコレーションする方法です.クラスオブジェクトでクラスメソッドを定義する場合は、アクセラレータ@classmethodを使用して装飾する必要があります.また、最初のパラメータはクラスオブジェクトを表し、対応する実パラメータはシステムによって自動的に入力されます.最初のパラメータの名前は、通常clsまたは他の名前です.クラスメソッドはクラスオブジェクトによって呼び出すことができ、構文フォーマットは:クラスオブジェクト.メソッド名([実パラメータ])またはcls.メソッド名([実パラメータ])クラスメソッドは、クラスオブジェクトとして構文形式でインスタンスオブジェクトによって呼び出すこともできる.方法名([実参])またはself.メソッド名([実パラメータ]).
    class MyClass(object):
    	#          
    	@classmethod
    	def clss_func(cls, a, b):
    		print(a, b)
    
    #          
    MyClass.class_func('Hi','everyone!')
    #Hi  everyone!
    
    #           
    mc = MyClass()
    mc.class_func(1, 2)
    #1 2
    
    class MyClass(object):
    	#          
    	@classmethod
    	def clss_func_1(cls, a, b):
    		print(a, b)
    
    	#           
    	@classmethod
    	def clss_func_2(cls, a, b):
    		MyClass.class_func_1(1, 2)
    		#or
    		cls.class_func_1(1, 2)
    
    	#           
    	def ins_func(self):
    		self.class_func_1(1, 2)
    
    mc = MyClass()
    mc.class_func_2()
    #1 2
    #1 2
    

    スタティツクメソッド
    1.クラスオブジェクトの静的メソッドは、通常の関数にすぎません.通常の関数をクラスオブジェクトに帰属するのは、コード管理を容易にするためかもしれません.2.クラスオブジェクトで静的メソッドを定義する場合は、デコレーション@staticmethodを使用してデコレーションする必要があります.3.静的方法は単なる一般的な関数であるため、最初のパラメータには特別な意味と要求はない.4.静的方法はクラスオブジェクトによって呼び出すことができ、文法形式は:クラスオブジェクト.メソッド名([実パラメータ])またはcls.メソッド名([実参])5.静的メソッドは、インスタンスによって呼び出すこともできる、構文フォーマットは、インスタンスオブジェクトである.方法名([実参])またはself.方法名([実参]).6.静的メソッドを呼び出すときのパラメータ伝達は、通常の関数を呼び出すのと同じです.
    class MyClass(object):
    	@staticmethod
    	def sm(p1, p2):
    		print(p1,p2)
    
    MyClass.sm(1, 2)
    #1 2
    
    mc = MyClass()
    mc.sm(1, 2)
    #1 2
    

    アクセス制御
    アクセス制御とは、クラスオブジェクトの属性とメソッドがクラスオブジェクトの外部に直接アクセスできるかどうかを制御することです.クラスオブジェクトのプロパティまたはメソッドの前に下線_を2つ追加すると、クラスオブジェクトの外部では、そのプロパティやメソッドに直接アクセスできません.
    class MyClass(object):
    	def __init__(self):
    		self.__pia = 18
    
    	def __pim(self):
    		print("__pim()    ")
    
    mc = MyClass
    print(mc.__pia)
    #AttributeError: 'MyClass' object has no attribute '__pia'
    
    mc.__pim()
    #AttributeError: 'MyClass' object has no attribute '__pia'
    
    class MyClass(object):
    	def __init__(self):
    		self.__pia = 18
    	def __pim(self):
    		print("__pim()    ")
    	def do_sth(self):
    		print(self.__pia)
    		self.__pim()
    
    #18
    #__pim()    
    #None
    

    1.クラスオブジェクトの外部で二重線で始まる属性またはメソッドに直接アクセスできないのは、Pythonインタプリタが属性またはメソッドを外部に渡すためである.xxxは別の名前に変更されました:クラス名_xxx.クラスオブジェクトの外部では、_クラス名_xxxアクセス属性またはメソッド_xxx.ただし、異なるバージョンのPythonインタプリタが属性やメソッドをxxxは違う名前に変更されました.2.クラスオブジェクトの外部で動的にバインドできる名前は_xxxの属性またはメソッド.クラスオブジェクトの内部名が__である.xxxの属性または方法は異なる3.クラスオブジェクトのプロパティまたはメソッドの前に下線_を2つ追加する以外は、クラスオブジェクトのプロパティまたはメソッドの前に、単一の下線__を追加することもできます.これは、クラスオブジェクトの外部でこのプロパティまたはメソッドにアクセスできるが、アクセスしないほうがいいことを示します.