怎麼理解python中的裝飾器(小白通俗理解)
今天學習了python中的裝飾器,我來說一說我對python裝飾器的理解。
作用
它可以在不改變一個函數代碼和調用方式的情況下給函數添加新的功能。
用途
- 應用於緩存、
- 權限校驗(如django中的@login_required和@permission_required裝飾器)
- 性能測試(比如統計一段程序的運行時間)
- 插入日誌等應用場景
- python-web框架中的路由功能也用到了裝飾器
裝飾器用到的知識點
- 嵌套函數
如果在一個函數的內部還定義了另一個函數(注意: 是定義,不是引用!),這個函數就叫嵌套函數。 - 閉包(Closure)
閉包是Python編程一個非常重要的概念。如果一個外函數中定義了一個內函數,且內函數體內引用到了體外的變量,這時外函數通過return返回內函數的引用時,會把定義時涉及到的外部引用變量和內函數打包成一個整體(閉包)返回。
一般一個函數運行結束的時候,臨時變量會被銷燬。但是閉包是一個特別的情況。當外函數發現,自己的臨時變量會在將來的內函數中用到,自己在結束的時候,返回內函數的同時,會把外函數的臨時變量同內函數綁定在一起。
通用的裝飾器
def hint(func):
def wrapper(*args, **kwargs):
print('{} is running'.format(func.__name__))
return func(*args, **kwargs)
return wrapper
@hint
def hello():
print("Hello!")
裝飾器在路由當中的使用
def route(url):
def set_func(func):
# URL_FUNC_DICT["/index.html"] = index
URL_FUNC_DICT[url] = func
def call_func(*args, **kwargs):
return func(*args, **kwargs)
return call_func
return set_func
@route("/index.html")
def index():
with open("./templates/index.html") as f:
content = f.read()
my_stock_info = "哈哈哈哈"
content = re.sub(r"\{%content%\}", my_stock_info, content)
return content