網(wǎng)站設(shè)計維護員長沙百度提升排名
- 前言
- 一、帶參數(shù)的裝飾器
- 二、在裝飾器里面?zhèn)魅雲(yún)?shù)
- 總結(jié)
前言
暫無
一、帶參數(shù)的裝飾器
我們知道,不帶參數(shù)的裝飾其實就是在函數(shù)的頭上添加裝飾器時放一個名稱,這種寫法就默認了裝飾器函數(shù)調(diào)的是被裝飾函數(shù)自己,換句話說就是,大家一致認同的這種規(guī)則了,@裝飾器 這種表示法就是要調(diào)被裝飾函數(shù)自己。
那么這種表示是在一層閉包實現(xiàn)的,那么有2層閉包又實現(xiàn)了什么呢?
答:兩層閉包就實現(xiàn)了裝飾器帶參數(shù)。
# 裝飾器帶參數(shù)
import time
from functools import wrapsdef my_timer(parm):def timer(func):@wraps(func)def decorate(*args, **kwargs):if parm == 1:print("這是func1")start_time = time.time()func(*args, **kwargs)end_time = time.time()total = end_time - start_timeprint("函數(shù)運行時間:", total)elif parm == 2:print("這是func2")start_time = time.time()func(*args, **kwargs)end_time = time.time()total = end_time - start_timeprint("函數(shù)運行時間:", total)return decoratereturn timer@my_timer(2) # 裝飾器帶參數(shù)
def func1():time.sleep(2)func1()
那我們分析一下,當我們使用一層閉包的時候,在外面被裝飾的函數(shù)的頭上只放一個裝飾器函數(shù)。
舉例:
我們現(xiàn)在就一層閉包(在這里只是演示,實際上這個代碼是跑不起來的),一層閉包的寫法和在函數(shù)頭上的寫法前面的知識已經(jīng)解釋過了。
假設(shè)第二層閉包能夠用的情況下,那么在函數(shù)頭上的表現(xiàn)是:
二、那么如果要在裝飾器里面?zhèn)魅雲(yún)?shù)怎么做呢?
那就直接在一層的閉包外,再加一層閉包,這一層閉包的作用就是用來傳參數(shù)的,說的通俗一點,就是用來放置外來的參數(shù),這個參數(shù)用于里面的閉包。雖然外層的閉包只起了這樣的作用,主要的邏輯還是在里面的閉包,不過呢,我們在使用這個閉包的時候,還是要使用外層的函數(shù)名,不然我們怎么傳入?yún)?shù)呢?
總結(jié)
暫無