裝飾器的作用:在不改變原函式的情況下給函式增加功能!
裝飾器由閉包和語法糖組成
閉包:即兩個函式巢狀,外部函式返回內部函式的引用,外部函式一定會傳入引數,外部函式起的是交換引用的作用:把要裝飾的引數(也就是裝飾前的函式)與 裝飾後的函式的引用對換,而里層的函式做的是執行操作,呼叫原函式就是在這裡執行的!
#閉包模型
#外函式
def set_fun(func):
def call_fun( *args, **kwargs):
#裡函式
#。。這裡可作為要執行原函式前執行的**段,比如驗證功能。。
result = func(*args, **kwargs)
#這裡可以對原函式的執行結果做篩選
return result
return call_fun
2.語法糖:
@set_fun # @這個就是語法糖,可以理解為:set_fun ===>test = set_fun(test)
def test():
print("啦啦啦!我是要裝飾的原函式!^_^")
#下面說一種特殊三重裝飾器,也就是給裝飾器傳參
def set_args(args):
print("args%s"%str(args))
def set_fun(func):
print("set_fun")
def call_fun(*args,**kwargs):
print("call_fun")
return func(*args,**kwargs)
return call_fun
return set_fun
@set_args(123) # 1.set_args(123) 2. @set_fun====>test = set_fun(test)
def test():
print("test is show")
test()
裝飾器的應用場景很多:比如python裡的定義類方法和靜態方法就是用的裝飾器:
class a(object):
@classmethod
def show_a(self):
pass
@staticmethod
def show_b():
pass
還有就是django與flask的網頁路由也是用的裝飾器的原理去實現:
@api.route('/send_sms_code',methods=["post"])
pass
下面說一下裝飾器在一種特殊的情況下:
我曾經在乙個flask的專案的時候出現過乙個異常,那時候我寫了乙個裝飾器去處理多個檢視函式的效驗登陸狀態的問題,然後出現了乙個異常:
這個異常出現的原因是因為乙個模組下的多個檢視函式同時使用這個裝飾器,然後這幾個檢視函式之間的資料產生了互相影響,最後我用functools模組下的wraps去消除這種影響!
from functools import wraps
def login_required(view_func):
"""自定義裝飾器判斷登陸狀態
使用裝飾器裝飾函式時,會修改被裝飾的函式的__name屬性和被裝飾的函式的說明文件
為了不讓裝飾器影響被裝飾的函式的預設的資料,我們會使用@wraps裝飾器,提前對view_funcj進行裝飾
"""@wraps(view_func)
def wraaper(*args, **kwargs):
"""判斷使用者登入的邏輯"""
user_id = session.get('user_id')
if not user_id:
return jsonify(code=ret.sessionerr, codermsg='使用者未登入')
else:
g.user_id = user_id
# 執行被裝飾的檢視函式
return view_func(*args, **kwargs)
return wraaper
裝飾器我在很多第三方的原始碼裡都看到它的身影,它的強大可見一斑!
python三大神器 裝飾器
裝飾器 decorator 能增強now 函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now 函式的定義,這種在 執行期間動態增加功能的方式,稱之為。本質上,decorator就是乙個返回函式的高階函式。所以,我們要定義乙個能列印購物的decorator,可以定義如下 def inn...
Python三大神器之 裝飾器
def info print 這是學生資訊 info a info print id a print id info a 展示 4009632 4009632 這是學生資訊def info return 小王 defsuccess print 返回值函式 def printinfo func par...
python三大神器裝飾器 Python 裝飾器
裝飾器 本質是函式,用於裝飾其他函式,為其他函式新增附加功能 原則 1.不能比修改被裝飾的函式的 2.不能修改被裝飾的函式的呼叫方式 import time def timmer func def warpper args,kwargs start time time.time func stop ...