2. 裝飾器
2.3. 裝飾器執行時間
2.5. 無法除錯(無法獲取元資料)
todo(目前不太關心的):
閉包:
普通物件也可以作為函式使用,即有些物件不是函式,也可以呼叫。
例項:(lambda x, y: x+y)(5, 3)
使用場景:
注意事項:
在匿名函式中繫結變數的值:
# 如果直接使用,則不會記住變數的值,而是跟變數一起變化
x =10
a = labmda y: x + y
x =20
b =lambda y: x + y
a(10
)# 30
b(10
)# 30
# 可以設定預設引數來實現
x =10
a = labmda y, x=x: x + y
x =20
b =lambda y, x=x: x + y
a(10
)# 20
b(10
)# 30
可用於解包
以*
打頭的引數只能作為最後乙個位置引數,但可以存在其他引數;以**
打頭的引數只能作為最後乙個引數出現。
單獨的星號可以作為分隔符,用於分隔位置引數與命名關鍵字引數。
a =
1b =
2deff(
):c =
3global b
print
(a)# 報錯,無法直接獲取全域性變數
print
(b)# 正常,因為已經在區域性作用域中宣告了全域性變數
print
(c)# 正常,直接呼叫區域性變數
應用舉例:日誌、訪問控制與授權、計算執行時間、限制請求速率、快取。
本質:
多裝飾器修飾應用順序從下到上,可稱為裝飾器棧。
2.2.1 形式一:最簡單的裝飾器,不實現任何功能。
def
null_decorator
(func)
:return func
@null_decorator
defgreet()
:return
'hello!'
# 上面這種裝飾器語法等價於下面的方法
defgreet()
:return
'hello!'
greet = null_decorator(greet)
2.2.2. 形式二:裝飾器的基本形式。def
uppercase
(func)
:def()
: original_result = func(
) modified_result = original_result.upper(
)return modified_result
@uppercase
defgreet()
:return
'hello!'
2.2.3. 形式三:引數化裝飾器。registry =
set(
)def
register
(active=
true):
defdecorate
(func)
:print
('running register(active=%s)->decorate(%s)'
%(active, func)
)if active:
registry.add(func)
else
: registry.discard(func)
return func
return decorate
@register(active=
false
)deff1(
):print
('running f1()'
)@register(
)# 注意,這裡不能少了括號,否則報錯
deff2()
:print
('running f2()'
)deff3(
):print
('running f3()'
)
2.2.4. 形式四:多種形式裝飾器。def
logged
(func=
none,*
, level=logging.debug, name=
none
, message=
none):
if func is
none
:return partial(logged, level=level, name=name, message=message)..
.
2.2.5. 形式五:類中定義裝飾器。classa:
defdecorator1
(self, func)
: @wraps(func)
def(
*args,
**kwargs)
:print
('decorator 1'
)return func(
*args,
**kwargs)
@classmethod
defdecorator2
(cls, func)
: @wraps(func)
def(
*args,
**kwargs)
:print
('decorator 2'
)return func(
*args,
**kwargs)
a = a(
)@a.decorator1
defgreet()
:return
'hello!'
@a.decorator2
defspam()
:pass
def
register
(func)
:print
('running register(%s)'
% func)
return func
@register
deff1()
:print
('running f1()'
)@register
deff2()
:print
('running f2()'
)def
main()
:print
('running main()'
) f1(
) f2(
)# 輸出結果
# running register()
# running register()
# running main()
# running f1()
# running f2()
def
uppercase
(func)
: @functools.wraps(func)
:def()
:return func(
).upper(
)
Python 基礎 6 裝飾器
什麼是裝飾器,裝飾器是 python 中特殊的語法糖,它的作用就是用來裝扮函式 在開發過程中我們都要遵循 開放封閉 原則 盡量別改動原來的 更多的是擴長 功能 怎麼在不修改 的前提做到給 加功能呢,那就是裝飾器出場的時候了 coding utf 8 def test func 基礎裝飾器 print...
Python基礎學習 函式裝飾器
裝飾器是python中非常實用的函式表達法,盡頭我們不講裝飾器原理,只講怎麼應用。裝飾器原理涉及物件導向以及函式本身也可以作為乙個引數被傳遞,原理比較簡單,但由於迴圈巢狀初學者難以理解。既然難以理解,那就先學會怎麼用,有了經驗,理解起來就相對容易了。首先我們要明白,裝飾器內函式是先於被裝飾函式執行的...
Python基礎11(函式裝飾器)
import time 模組 time.sleep 讓程式在執行到這個位置的時候停一會 time.time 獲取當前時間 timmer 語法糖 func timmer func 語法糖使用方法 1 import time 2def timer func 3def inner args,kwargs ...