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