python学習ノート-Day 04-第4部(装飾器)
今週pythonの装飾器を学んで、以前接触したことがなくて、phpの開発をする同僚に装飾器とは何かを聞いて、彼は構造関数のように言って、残念ながら私はすでに構造関数を忘れて、何なのか思い出せません.今すぐ資料を探して理解します.なにしろデコレーションは使わなくてもプログラムを実現できる機能ですが、デコレーションを使うと技術的に見えますが、あまり理解できません.
装飾器を学ぶ前に、まず関数を理解する必要があります.前のノートには、関数に関するメモが書かれています.まず、前の文章を参考にすることができます.ここでは簡単に言います.
pythonでは、defキー、関数名、オプションのパラメータリスト、および関数体で構成され、return文で値を返します.return文がない場合、関数は自動的にNone値を返します.
装飾器は実は1つの関数をパラメータとして、代替版の関数を返します.
出力:
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()は,使用中に新しい文法を学ぶ必要はなく,変数を簡単にコピーすれば効果的である.
上のコードを実行すると、外でいくら呼び出しても元の関数は関係ありませんwtest()は、改造バージョンのw_を呼び出します.test()
もう一つの具体的な例を示します.
装飾器を学ぶ前に、まず関数を理解する必要があります.前のノートには、関数に関するメモが書かれています.まず、前の文章を参考にすることができます.ここでは簡単に言います.
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