12日目の閉鎖機能およびデコレータ

閉鎖機能やデコレータ

閉鎖機能

クロージャは、(内部関数function)閉じている彼のためにそれがグローバルスコープの範囲外ではないので、機能パッケージローカルスコープの内層の外側(含むパッケージではなく、外側ラップの機能)ローカルスコープに対応

次の2つの方法の関数にパラメータを渡します

  1. パラメータを使用します
def func(x):
    print(x)
    
func(1)   # 1
  1. パケット関数(関数名を使用して、関数の引数として使用することができ、関数名は、別の関数の戻り値として使用することができます)
def outter(x):
    def func():
        print(x)
    return func
    
f=outter(1)   #  调用outter的时候内部没有可执行的代码,返回一个函数名func,把这个函数名赋值给f,同时在这个outter函数对应的局部名称空间中有一个x=1
f()         #   调用f()实质上是在调用func(),程序调用func()函数,执行内部print命令,然后从func对应的局部名称空间找x,然后再从外层包裹的outter函数对应的局部名称空间查找x,找到x=1,打印

アプリケーションパッケージの閉鎖機能

意義閉鎖パッケージ:優先的に使用された関数の呼び出しを行うもの層に包まれたスコープ機能、外部に返された関数オブジェクトだけでなく、関数オブジェクト、どこ外側ラップに対応するその機能スコープ

デコレーター

このツールは、意味、およびプログラムの機能が一つの機能を提供するツールであり、デコレータは意味飾られるオブジェクトに機能を追加することで、これデコレータを定義する関数を定義することですが、関数が関数であります余分な機能を追加するために使用される他の機能、デコレータ自体は任意の呼び出し可能オブジェクトにすることができ、飾られるオブジェクトは、任意の呼び出し可能オブジェクトことができます。

なぜ使用デコレータ

装飾は、装飾されるべき対象のソースコードを変更しないことがあり、ならびに新規な特徴は、オブジェクトが内装呼ばれるオブジェクト装飾された場合を変更することなく追加します

デコレータの使い方

# deco就是装饰器
def deco(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper

def sleep():
    print('zaoshanghao')

sleep=deco(sleep)
sleep()
  1. デコレータを呼び出し、睡眠に渡されたパラメータとして
  2. ラッパー関数は、名前だけラッパーを返したときにインテリアデコレーターのみ定義された関数や機能を返すので、呼び出し元の関数は実行されません
  3. 関数オブジェクトの概念を使用すると、元のラッパー関数名に名前を割り当てるために同等の本来の装飾関数名に割り当てられています
  4. 機能ラッパーインテリアデコレーターを呼び出すに相当する時間の関数+()の実装の元の名前
  5. 関数の受信元の名前は、元の関数を直接呼び出すことができれば可変細長いラッパー関数パラメータの参加者は、最内層がすべての着信外デコレータを受信し、内層の機能に割り当てられ
  6. 最も内側の関数が呼び出され、直接ではなく、定義されたので、コードが直接実行されます
  7. ラッパー関数の中で元の関数が値を返した場合、その後、ラッパー関数が値を返す必要があり、需要関数に追加することができますので、我々は、最も内側の解像度に割り当てられた機能することができ、ラッパーreturnresで同じ効果と本来の機能を実現
  8. 元の関数は、元の関数のラッパーに相当するので、質量の参加を必要とするので、私たちはちょうどライン上を通過するラッパー関数のパラメータを与えた場合、およびので、不確実性の特定の引数とデコレータ汎用テンプレート可能に合格する必要があるので、我々は使用可変長引数\パラメータ引数および*すべての着信パラメータを受信するためのパラメータとしてkwarg形、およびラッパー関数funcパラメータの最内層

デコレータのシンタックスシュガー

装飾品では、直接単一の書き込み一行@デコレータ名の上に、あなたは、コードの行を保存することができます

元の関数名=デコレータ名(元の関数名)

おすすめ

転載: www.cnblogs.com/masterjian924/p/10957084.html