首先,我們要理解裝飾器的含義,顧名思義,裝飾器的主要作用就是裝飾!即為乙個或多個現有的函式增加功能。
在了解裝飾器功能前,我們先了解為什麼要使用裝飾器,好比某個專案已經上線,但是現在想給其中幾個功能新增一點功能,這時候我們應該盡量做到不去修改原方法的**和呼叫方式,以這兩點為要求,就出現的裝飾器。
我們先來看看裝飾器的運作模式:
def timer(func):
import time
start = time.time()
re = func(*args,**kwargs)
end = time.time()
print("total time :",start-end)
return re
@timer
def index():
print("你好,世界!")
index()
接下裡我們進行詳細的解釋:
裝飾器的引用方式就是在被裝飾函式上用@
加上裝飾器的名稱
裝飾器的本質就是函式,所以這裡有乙個概念:
裝飾器的實際效果應該是:
index = timer(index)
index()
如果理解了這一點,那麼就再去理解巢狀函式。首先,在乙個函式體內定義的方法是無法被外部直接引用的。意思就是:
def test1():
def test2():
pass
return test2
test2() #非法的,全域性變數中沒有test2
以上方的**為例,函式test2
是屬於test1
的區域性變數,所以無法在全域性中直接呼叫區域性變數中的某乙個變數,如果想用test2
只能通過test1
的返回值。這就是函式之間的巢狀。
值得注意的是,定義函式的目的就是為了執行,所以不要忘了呼叫方法。記得在巢狀函式裡使用return!
理解以上的概念應該對裝飾器有了一定的概念,裝飾器就是執行傳入方法並增加一定的功能後返回原方法的返回值的函式
補充:多級巢狀裝飾器:
為什麼會用到多級巢狀裝飾器呢?比如現在有乙個**,本來用的mysql
資料庫,但是現在做大做強了,一部分資料存到了oracle
資料庫,那麼就要對以前的的功能進行修改與分類,去不同的資料庫查詢資料。
所以就要在開始做乙個判斷:
def auth(database):
def login(func):
def inner(*args,**kwargs):
if database == 'mysql':
username = input("username:")
pwd = input("pwd:")
if username == 'du' and pwd == '123':
print("登入成功!")
return func(*args,**kwargs)
else:
print("登入失敗")
elif database == 'orcle':
print("非法請求!")
return inner
return login
@auth('mysql')
def shopping():
print("shopping")
有同學會問,為什麼非要在外層套乙個呢?我們這樣理解,實際上被裝飾函式的裝飾器是哪個呢?
auth(database)返回的是login方法,所以本質上login才是那個真正的裝飾器,外層的可以理解為帶引數的判斷條件而已。
裝飾器知識梳理
首先,我們要理解裝飾器的含義,顧名思義,裝飾器的主要作用就是裝飾!即為乙個或多個現有的函式增加功能。在了解裝飾器功能前,我們先了解為什麼要使用裝飾器,好比某個專案已經上線,但是現在想給其中幾個功能新增一點功能,這時候我們應該盡量做到不去修改原方法的 和呼叫方式,以這兩點為要求,就出現的裝飾器。我們先...
裝飾器路由具體實現梳理
werkzeug實現路由 除錯和web伺服器閘道器介面 jinja2實現了模板。其內部實現了很多web框架底層的東西,比如request和response物件 與wsgi規範的相容 支援unicode 支援基本的會話管理和簽名cookie 整合url請求路由等。werkzeug庫的 routing ...
知識梳理計畫
知識的學習一般來說有兩個過程,第乙個是摳細節,理解知識,另乙個是將知識點進行總結歸納融入到自己的知識體系中。如果工作學習過程中需要用到該知識點的時候可以很快的提取出來。在這幾年的學習以及研究生活中,我也陸陸續續的鑽研過一些演算法,但是很多東西,都是當時懂了,但是過了一段時間,可能就忘記了,等到需要使...