python閉包、装飾器&文法糖

6389 ワード

クローズド・パッケージとは、関数を構成する文と、これらの文の実行環境をパッケージ化したときに得られるオブジェクトです.
確かに複雑に聞こえますが、栗で理解してください.もし私たちがfoo.pyモジュールでは、foo.pyfilename = "foo.py"def call_func(f):return f()#前述のように、fは関数オブジェクトを参照し、別のfuncで呼び出す.pyモジュールには、#funcというコードが書かれています.pyimport foo#fooをインポートします.pyfilename = "func.py"def show_filename():    return "filename: %s"% filenameif __name__ == "__main__":    print foo.call_func(show_filename)#注意:実際に呼び出された場所はfoo.call_func関数ではpython funcを使用します.pyコマンドはfuncを実行します.py時の出力結果は次のとおりです.chiyu@chiyu-PC:~$ python func.py filename:func.pyは明らかにshow_filename()関数で使用されるfilename変数の値は、それと同じ環境(func.pyモジュール)で定義されています.だがpyモジュールにも同名のfilename変数が定義されており、実際にshow_が呼び出されます.filenameの位置もfoo.pyのcall_func内部.ネスト関数の場合、このメカニズムは、閉パケットが内層関数の実行に必要な環境全体をキャプチャすることをより明らかにします:#enclosed.pyimport foodef wrapper():    filename = "enclosed.py"def show_filename():        return "filename: %s"% filename    print foo.call_func(show_filename)#出力:filename:enclosed.py実際、各関数オブジェクトには、その関数定義時に存在するグローバル名空間を指す__があります.globals__属性:#show_filename inside wrapper#show_filename.__globals__
{'_builtins_':,#内蔵ドメイン環境'_file_':'enclosed.py','wrapper':,#直接周辺環境'_package_':None,'_name_':'_main_','foo':,#グローバル環境'_doc_':None}
アクセラレータは閉パッケージですが、アクセラレータが入力するパラメータは関数です.
コンテキストを閉じてカプセル化し、この特性は既存の関数のパッケージに巧みに使用され、既存の関数に機能を追加することができる.これが装飾器です
装飾器の原則と構成:
原則:1、被装飾関数のソースコードは変更できません.2、被装飾関数の呼び出し方は変更できません.3、被装飾関数の実行結果は変更できません.装飾器は被装飾関数に対して透明である.
pythonではすべてオブジェクトなので、pythonではすべて参照タイプです.
したがって、関数は変数のように指向され、伝達されることができる.
def diguo():
print(" 50")
return 50
def doupi(fn):
def jia():
print(" 10")
return fn()+10
return jia
def xiang(fnn):
def jia():
print(" ")
return fnn()+5
return jia
aa=doupi(xiang(diguo))
print(aa())

, python
def doupi(fn):
    def jiadoupi():
        print("    10 ")
        return fn()+10
    return jiadoupi
def xiangcai(fnn):
    def jiaxiangcai():
        print("    5 ")
        return fnn()+5
    return jiaxiangcai
@xiangcai
@doupi
def diguo():
    print("  50")
    return 50
print(x)

@後のメソッド名はpythonが持参した文法糖ですが、簡単に書くためにアクセサリー呼び出しと同じ効果を得ることができ、このようなプログラムは簡潔に見えるのではないでしょうか.
デザインモードではアクセサリーが彼の名前のように飾られています