python学習ノート-Day 04-第4部(装飾器)

3078 ワード

今週pythonの装飾器を学んで、以前接触したことがなくて、phpの開発をする同僚に装飾器とは何かを聞いて、彼は構造関数のように言って、残念ながら私はすでに構造関数を忘れて、何なのか思い出せません.今すぐ資料を探して理解します.なにしろデコレーションは使わなくてもプログラムを実現できる機能ですが、デコレーションを使うと技術的に見えますが、あまり理解できません.
装飾器を学ぶ前に、まず関数を理解する必要があります.前のノートには、関数に関するメモが書かれています.まず、前の文章を参考にすることができます.ここでは簡単に言います.
pythonでは、defキー、関数名、オプションのパラメータリスト、および関数体で構成され、return文で値を返します.return文がない場合、関数は自動的にNone値を返します.
装飾器は実は1つの関数をパラメータとして、代替版の関数を返します.
def wrapper(a_fun):
    def fun():
        print "a fun"
        tmp = a_fun()
        return tmp +1
    return fun

def w_test():
    return 1

var1 = wrapper(w_test)
print var1()   #1
print w_test()

出力:
a fun#var 1()出力2#var 1()出力1#w_test()出力
上は装飾器の例で、a_という名前の関数wrapper()を定義しました.funの関数は、関数内部にネストされた関数fun()を定義します.fun()は文字列を出力し、a_を呼び出します.fun(),tmpはa_を得ることができるfun()の戻り値は、wrapperがfun()を呼び出すたびに値が異なる場合があります(他の関数を使用している場合は)が、a_にかかわらずfun()の戻り値は何ですか.外で呼び出されます.最後のfun()の戻り値はa_です.fun()+1 . 位置1では変数var 1に格納された関数を呼び出し、関数w_ではなく印刷された文字列と戻り値2を得ることができる.test()の戻り値
var 1は関数w_であると考えられるtest()の装飾バージョン、あるいは改造バージョンで、元の関数w_test()は任意の変更を行います.デコレーションを書くと、外はデコレーションバージョンで元の関数を完全に置き換えることができますwtest()は、改造版の関数w_を得ることができます.test()は,使用中に新しい文法を学ぶ必要はなく,変数を簡単にコピーすれば効果的である.
w_test = wrapper(w_test)
w_test 
  :
<function fun at 0x7f5edf6c5668>

上のコードを実行すると、外でいくら呼び出しても元の関数は関係ありませんwtest()は、改造バージョンのw_を呼び出します.test()
もう一つの具体的な例を示します.
wrapper(func):
    result():
        func()
        result
foo():
    foo = wrapper(foo)   ###   
foo()



@

python2.4 , @ ,


foo = wrapper(foo)

, , 。 , @ , :

wrapper(func):
    result():
        func()
        result

@foo():
    foo()

,   foo = wrapper(foo)  @wrapper  ,python , , 。


, 。 ?

*args **kwargs。

first(*args):
    args

first()
first(,,)
lst = [,,,]
first(*lst)

first , , * , ,


** * , ** , 。

sec(**kwargs):
    kwargs

dic = {:,:}
sec()
sec(=,=)
sec(**dic)


war(func):
    in_war(*args,**kwargs):
        %(args,kwargs)
        
    in_war


@foo_1(x,y=):
    x+y

@foo_2():
    foo_1(,)
foo_1()
foo_2()


http://timesnotes.blog.51cto.com/1079212/1715330

http://www.timesnotes.com/?p=111