python中的裝飾器介紹
在瞭解裝飾器之前,我們需要知道什麼閉包是什麼鬼!
閉包:在一個函式內定義了一個函式f,並且這個函式f引用外部變數,在把這個函式f當做返回值返回。
上述說了閉包的三個條件:
1 函式內定義了一個函式f
2 f函式引用了外部變數
3 f被當做返回值返回
def t1():#定義t1函式 x=2 def f():#t1函式內部定義了f函式 print(x)#f函式引用了不屬於自己內部的變數x return f #f被當做返回值返回
而裝飾器有是什麼鬼呢?其實閉包的一種運用。
裝飾器:在不改變函式(當然還有其他的)的程式碼和呼叫方式的前提下,為函式增加新的功能!
那麼需求來了:例如我定義了一個下載方法,我在想不改變下載方法的程式碼和呼叫方式,為其加一個需要登入後才能下載的功能
def get(file):#下載方法 print('下載成功',file)
那麼如何實現呢?這裡就要用到上面提到的閉包。
我們再來看看閉包,即是在一個函式內定義了一個函式f,並且這個函式f引用外部變數,在把這個函式f當做返回值返回
那麼上面的需求我們可以先試著做第一步,即是不改變下載方法的程式碼,為其加一個需要登入後才能下載的功能
print('下載成功',file) def auth(get,*args,**kwargs): print('登入方法') get(*args,**kwargs) auth(get,'a.txt') #結果: #登入方法 #下載成功 a.txt
但是這樣的話呼叫方式改變了,那麼我們可以利用閉包:
print('下載成功',file) def func(get): def auth(): print('登入方法') get() return auth get=func(get) get('dasd')
這樣的話,引數有傳不進去,並且報錯引數沒有接收到:
我們分析一下上面程式碼 func(get)其實應該是auth這函式名,那麼get=func(get),就是把auth賦值給get變數,即是次數 get=auth,
那麼 我們呼叫get('dasd') 即是auth('dasd'),即是我們需要修改auth函式
print('下載成功',file) def func(get): def auth(file): print('登入方法') get(file) return auth get=func(get) get('dasd')
這樣的話get('dasd')的時候就是呼叫auth('dasd'),那麼會執行登入方法,並且執行get('dasd'),這裡是真正的下載方法
最佳化一下就是這樣的:
def auth(f): def wrapper(*args,**kwargs): print('其它功能或方法') f(*args,**kwargs) return wrapper
這樣的要裝飾get函式的時候,只需get=auth(get),這裡第一個get是變數,第二個get是函式名,這樣就實現get不改變其的程式碼和呼叫方式,為其增加功能。
在python中 get=auth(get),可以省略為:
def wrapper(*args,**kwargs): print('登入方法') f(*args,**kwargs) return wrapper @auth # 相當於get=auth(get) def get(file):#下載方法 print('下載成功',file)
當然上面是裝飾器的無參裝飾器,還有有參裝飾器:
f(*args, **kwargs) return wrapper return auth @authx('adas') # 相當於get=auth(get) 當然 a的值也傳入了 def get(file):#下載方法 print('下載成功',file)
本文作者:孤月靈聲
原文連結:https://www.cnblogs.com/wh-alan/p/9287434.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31473948/viewspace-2157622/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python中的裝飾器Python
- python中裝飾器的原理Python
- 用於資料科學的幾種Python裝飾器介紹 - Bytepawn資料科學Python
- python的裝飾器Python
- python裝飾器2:類裝飾器Python
- 談一談Python中的裝飾器Python
- 深入理解Python中的裝飾器Python
- Python 中的閉包與裝飾器Python
- python中的裝飾器的使用實戰Python
- Python 裝飾器Python
- Python裝飾器Python
- python的裝飾器@的用法Python
- Python 裝飾器原理Python
- Python裝飾器模式Python模式
- 1.5.3 Python裝飾器Python
- Python 裝飾器(一)Python
- Python中裝飾器語法詳解Python
- Python裝飾器的前世今生Python
- Python中裝飾器的基本概念和用法Python
- python中contextmanager裝飾的方法PythonContext
- Python深入05 裝飾器Python
- python 之裝飾器(decorator)Python
- Python裝飾器詳解Python
- python裝飾器decorator的應用Python
- python的裝飾器和閉包Python
- 瞭解python的裝飾器特性Python
- python類裝飾器的使用注意Python
- Python 工匠:使用裝飾器的技巧Python
- python幾種裝飾器的用法Python
- JavaScript中的裝飾器--DecoratorJavaScript
- python描述器介紹Python
- Python 中級學習之函式裝飾器Python函式
- python裝飾器(披著羊皮的狼)Python
- Python深入分享之裝飾器Python
- Python閉包與裝飾器Python
- python裝飾器是什麼Python
- python裝飾器有哪些作用Python
- 粗淺聊聊Python裝飾器Python