Python裝飾器(語法糖)

2021-10-23 20:52:34 字數 3226 閱讀 1946

# todo make an order 

defordering()

:# 第一驗證 驗證是否登入

# 第二驗證 驗證是否具有許可權

print

('————————正在下訂單————————'

)# todo change password

defchangepwd()

:# 第一驗證 驗證是否登入

# 第二驗證 驗證是否具有許可權

print

('————————修改密碼————————'

)# todo show your personal info

defshowinfo()

:# 第一驗證 驗證是否登入

# 第二驗證 驗證是否具有許可權

print

('————————個人資訊————————'

)

可以看到我們在進行下訂單,修改密碼或是查詢自己的資訊時都需要在登入,並且具有相應許可權的情況下進行。

但是我們不可能在每個函式裡都寫這樣的兩個函式。因為**會變得冗餘。

所以這裡就用到了裝飾器但裝飾器是基於閉包的。所以先來了解閉包。

乙個函式巢狀另乙個函式,內部的函式使用到了外部的函式的變數

def

(num1)

:def

inner

(num2)

:return num1 + num2

return inner

if __name__ ==

'__main__':1

)print

(func(2)

)

列印輸出:3

閉包實現乙個二元一次直線方程

def

(k,b)

:def

inner

(x):

return x*k + b

return inner

if __name__ ==

'__main__':1

,1)print

(func(2)

)

列印輸出:3

缺點:一直引用外部函式的變數而不釋放,容易消耗記憶體

def

(func)

:# func被裝飾的函式的引用

definner()

:# 第一驗證 驗證是否登入

# 第二驗證 驗證是否具有許可權

print

("我是裝飾器"

) func(

)# 呼叫函式

return inner # 不帶括號,因為返回函式的引用,而不是呼叫函式

defchangepwd()

:print

('————————修改密碼————————'

)if __name__ ==

'__main__'

:# 引用

myfunc(

)

輸出列印:我是裝飾器

————————修改密碼————————

def

(func)

:# func被裝飾的函式的引用

definner()

:# 第一驗證 驗證是否登入

# 第二驗證 驗證是否具有許可權

print

("我是裝飾器"

) func(

)# 呼叫函式

return inner # 不帶括號,因為返回函式的引用,而不是呼叫函式

defchangepwd()

:print

('————————修改密碼————————'

)if __name__ ==

'__main__'

: changepwd(

)

列印輸出:我是裝飾器

————————修改密碼————————

def

(func)

:# func被裝飾的函式的引用

print()

definner()

:# 呼叫引數用inner

print(1

) func(

)print()

return inner

def(func)

:print()

definner()

:print(2

)# print要寫在func()之前!!!

func(

)print()

return inner

defchangepwd()

:print

('--------修改密碼-----------'

)

if __name__ ==

'__main__'

: changepwd(

)

def

(func)

:# 裝飾器要寫在函式上面,函式才能使用

definner

(*args)

: func(args[0]

,args[1]

)print

("{}塊錢用完了,蛋糕還不好吃……{}"

.format

(args[0]

,args[1]

))return inner

defcost

(money,status)

:print

("買買買了%d塊錢的蛋糕"

%money)

if __name__ ==

'__main__'

: cost(10,

"不開心不開心呢"

)

三層巢狀

def

create()

:def

(func)

:def

inner()

: func(

)return inner

裝飾器的應用場景:

1.減少冗餘**,提高函式的重用性

2.增加額外功能

缺點:一直引用外部函式的變數而不釋放,容易消耗記憶體

Python語法糖 裝飾器

這裡用來記錄python各種甜得發膩的語法糖,以及各種變形用法。太初,神諭 pythonic import light,於是有了光。裝飾器是用來給函式增加新功能的,對於支援高階函式的語言,函式引數直接穿進去就好了。但是python提供了更為優雅的解決方案,只需要乙個 就能搞定。裝飾器函式需要單獨寫出...

Python語法糖 裝飾器

這裡用來記錄python各種甜得發膩的語法糖,以及各種變形用法。太初,神諭 pythonic import light,於是有了光。裝飾器是用來給函式增加新功能的,對於支援高階函式的語言,函式引數直接穿進去就好了。但是python提供了更為優雅的解決方案,只需要乙個 就能搞定。裝飾器函式需要單獨寫出...

Python裝飾器語法糖

裝飾器的固定格式 普通版本 def timer func def inner args,kwargs 執行函式之前要做的 ret func args,kwargs 執行函式之後要做的 return ret return inner wraps版本 from functools import wrap...