裝飾器知識梳理

2022-04-29 14:42:08 字數 2231 閱讀 1308

首先,我們要理解裝飾器的含義,顧名思義,裝飾器的主要作用就是裝飾!即為乙個或多個現有的函式增加功能

在了解裝飾器功能前,我們先了解為什麼要使用裝飾器,好比某個專案已經上線,但是現在想給其中幾個功能新增一點功能,這時候我們應該盡量做到不去修改原方法的**呼叫方式,以這兩點為要求,就出現的裝飾器。

我們先來看看裝飾器的運作模式:

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

知識梳理計畫

知識的學習一般來說有兩個過程,第乙個是摳細節,理解知識,另乙個是將知識點進行總結歸納融入到自己的知識體系中。如果工作學習過程中需要用到該知識點的時候可以很快的提取出來。在這幾年的學習以及研究生活中,我也陸陸續續的鑽研過一些演算法,但是很多東西,都是當時懂了,但是過了一段時間,可能就忘記了,等到需要使...