Python基礎 6 函式 裝飾器

2021-10-23 07:12:33 字數 3828 閱讀 5269

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 ...