**kwargs)
end = time.time()
print(f"函数`{func.__name__}`运行的总时间为:{end - begin:.3}")
return wrapper
return inner
需要改造的地方:
1、装饰器函数此时并不是通过参数来传入被装饰的函数,而是定义装饰器自己的参数,演示时使用的是一个位置参数n,在后续如果遇到比较复杂的情况下也可以使用关键字形参、*args、**kwargs等收集参数。
2、内部函数inner
用来收集被装饰的函数。
3、内部函数inner
的内部函数wrapper
用来收集被装饰的函数的参数。并编写需要增强的命令。最终要执行被装饰的函数其实就是执行这个wrapper
函数。
装饰器接收参数:
import time
def decorator3(n):
def inner(func):
def wrapper(*args, **kwargs):
begin = time.time()
for _ in range(n):
func(*args, **kwargs)
end = time.time()
print(f"函数`{func.__name__}`运行的总时间为:{end - begin:.3}")
return wrapper
return inner
@decorator3(10)
def mysum3(a, b):
from time import sleep
total = a
for _ in range(total + 1, b + 1):
sleep(0.01)
total += _
print(total)
mysum3(1, 10)
# 等价于:mysum3 = decorator3(10)(mysum3)
55
55
55
55
55
55
55
55
55
55
函数mysum3
运行的总时间为:1.41
5.4.4.2.4 装饰器的返回值
如果你了解了上一节的内容,很容易想到只要在wrapper
函数中return就是被装饰函数的返回值。
装饰器定义:接收被装饰函数的返回值
import time
def decorator3(n):
def inner(func):
def wrapper(*args, **kwargs):
begin = time.time()
for _ in range(n):
func(*args, **kwargs)
end = time.time()
print(f"函数`{func.__name__}`运行的总时间为:{end - begin:.3}")
return end - begin
return wrapper
return inner
1、在上面的代码中,return end – begin就是被装饰器的返回值。可以通过变量进行接收。
@decorator3(3)
def mysum3(a, b):
from time import sleep
total = a
for _ in range(total + 1, b + 1):
sleep(0.01)
total += _
print(total)
total_time = mysum3(1, 10)
print(total_time)
函数mysum3
运行的总时间为:1.42
1.4218323230743408
5.4.4.2.5 多个装饰器装饰同一个函数
对于某个函数,可以使用多个装饰器对其进行装饰,写法如下:
@decorator1
@decorator2
def 被装饰函数():
pass
对于被多个装饰器装饰的函数,其装饰顺序为由最近到远,即decorator2会先装饰,然后是decorator1。