日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python decorator_python 中的decorator

發(fā)布時間:2023/12/15 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python decorator_python 中的decorator 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

python 中decorator的作用就是一個包裝的作用,所謂包裝指在執(zhí)行真正的函數(shù)之前或者之后,我們可以有一些額外的發(fā)揮余地。

decorator形式如下

def dec(arg1):

print("dec",arg1)

def func_replace(func):

print("func_replace",func)

def call_real_func(*args,**kwargs):

print("call_real_func")

func(*args,**kwargs)

return call_real_func

return func_replace

@dec("abc")

def realfun(arg):

print("realfun",arg)

realfun("123")

"@"的作用,我們通過這份代碼產(chǎn)生的python bytecode來弄清楚@的作用

F:\pyweb>python -m dis decorator.py

源碼行號 ?字節(jié)碼偏移 ? 字節(jié)碼 ? ? ? ? ? ? ? ? ? ? ? ? ?注釋

1     ? ?0 LOAD_CONST 0 ()

3 MAKE_FUNCTION 0

6 STORE_NAME 0 (dec)

//到此為止是def dec(): 產(chǎn)生 代表dec PyFunction的字節(jié)碼

12      9 LOAD_NAME 0 (dec) //加載 dec 對應(yīng)的PyFunctionObject

12 LOAD_CONST 1 ('abc') ? //壓入 'abc'到value-stack

15 CALL_FUNCTION 1   //調(diào)用函數(shù),就是dec('abc'),然后建dec 返回的 func_replace壓到 value stack

//到此相當(dāng)于 dec('abc')

18 LOAD_CONST 2 ()

//將代表realfun的PyCodeObject壓入value stack

21 MAKE_FUNCTION 0

//根據(jù)棧頂代表realfun的PyCodeObject生成 PyFunctionObject,返回之后,

//value stack的值為:PyFunctionObject(func_replace),PyFunctionObject(realfun)

24 CALL_FUNCTION 1

//調(diào)用func_replace(realfun) ,返回call_real_func 這個PyFunctionObject壓入

//value stack

//到此相當(dāng)于 dec('abc')(realfun)

27 STORE_NAME 1 (realfun) //替換掉 realfun

//到此相當(dāng)于realfun=dec('abc')(realfun)

17      30 LOAD_NAME 1 (realfun)

33 LOAD_CONST 3 ('123')

36 CALL_FUNCTION 1

39 POP_TOP

40 LOAD_CONST 4 (None)

43 RETURN_VALUE

分析之后可以知道@的作用就是在調(diào)用dec之后又添加了一個調(diào)用,而且這個調(diào)用的格式是固定的是func( realfun)這種。

所以

@dec("abc")

def realfun(arg):

print("realfun",arg)

這個的實際作用是realfun=dec('abc')(realfun)。中間有一個產(chǎn)生PyFunctionObject,并且隱藏了調(diào)用dec返回PyFunctionObject的過程

另外有一種沒有參數(shù)的decorator,他們省去了調(diào)用dec這一步,效果相當(dāng)于realfun=dec(realfun);

總結(jié)

以上是生活随笔為你收集整理的python decorator_python 中的decorator的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。