Python|クローズド&デコレーション

7602 ワード

クローズドパックとアクセサリー
一、閉包
1.定義:
一般的:関数のネスト
外部関数に内部関数を定義します.一般的にこの内部関数には外部関数から伝達されるパラメータが必要です.この内部関数とこれらのパラメータからなる特殊なオブジェクト(メモリ空間)を閉パッケージと言います.
2.劣勢
大規模なプロジェクトでは、閉パッケージが足りないかもしれませんが、クラスが必要です.
3.思考:関数、匿名関数、閉パッケージ、オブジェクトを実参とする場合の違いは何ですか?
匿名関数は基本的な簡単な機能を完成することができ、、、伝達はこの関数の参照は機能のみである.
普通の関数は比較的に複雑な機能を完成することができて、、、伝達はこの関数の引用は機能だけです
閉パケットは、より複雑な機能、、、伝達は、この閉パケットにおける関数およびデータであるため、伝達は機能+データである.
オブジェクトは最も複雑な機能を果たすことができ、、、、伝達は多くのデータ+多くの機能であるため、伝達は機能+データである.
4.nonlocal--キーワード
閉パッケージ内部関数閉パッケージの外部関数のローカル変数を呼び出す
二、装飾器
1.メリット:
1.関数内のコードを変更することなく、関数の機能を変更または追加し、元のコード関数を呼び出す関数名も変更しない.関数ネスト、関数呼び出し終了、作成空間終了3.解決:クラスを定義するときにInitメソッドに保存された値は,オブジェクトが乾いたときに消える.次に,クラス空間には他にも多くの魔法属性や方法が含まれており,空間を占有する必要がある.したがって、閉パッケージはよりスペースを節約し、
2.機能
1.ログを導入する2.関数実行時間統計3.関数の前準備処理4を実行する.関数後クリーンアップ機能5を実行する.権限チェックなどのシーン6.キャッシュ
3.デコレーション装飾開始時間
装飾器は文法糖@に出会ってから装飾を始めました呼び出し前にすでに装飾されていました
4.デコレーション
1.1つの装飾器は複数の関数を装飾することができ、1つの装飾ごとに閉包を作成することに相当する.
5.汎用装飾器
パラメータはすべて多値パラメータであり、パラメータと実パラメータを含む.returnは、関数(多値パラメータ)を返します.
6.一つの装飾器で複数の関数を装飾する
1.次の文法糖から上へ2を詰める.実行時に最外層の文法糖から内へ実行し、メインプログラムは最初に実行されますが、最初に実行された文法糖である最外層(一番上)の文法糖は最後に実行されます
7.疑問:1.複数のアクセラレータ内の埋め込み関数は同じ名前で、結果に影響しますか?
いいえ.関数名は同じですが、空間(役割ドメイン)が異なり、1つは局所変数の指向であり、1つはグローバル変数の指向であるためです.
三、demo
1.閉パッケージ
def set_fun(func):
    def call_func(*args, **kwargs):  #                 
        print("---      1---")
        print("---      2---")
        func(*args, **kwargs)  #   
    return call_func  #                ,         ;    return        


#     
def test():
    print("---       ,          ---")

a = set_fun(test)
a()  #   a

======>      --

test=set_fun(test)
test()

2.アクセサリー
def set_fun(func):
    def call_func(*args, **kwargs):  #                 
        print("---      1---")
        print("---      2---")
        return func(*args, **kwargs)  #   
    return call_func  #                ,         ;    return        

@set_fun
def test():
    print("---       ,          ---")
    return "       "
    
#      
test()   --->           
#       

class Test(object):
	def __init__(self, func):
		self.func = func

	def __call__(self):
		print("           .....")
		return self.func()


@Test  #    get_str = Test(get_str)
def get_str():
	return "haha"

print(get_str())