Python3装饰器及其使用
测试运行时间:
import time
start = time.time()
time.sleep(1)
end = time.time()
print('运行时间:', end - start)
改写成函数(修改函数):
# 得到运行时间
def f1():
start = time.time()
sum = 0
for i in range(100000):
sum += i
print(sum)
end = time.time()
print('f1() speed %s' % (end - start))
f1()
写成可以测试其他函数(传入函数):
# 遵守开放封闭原则
# 用于测试函数运行时间 把函数作为参数传入到另一个函数调用执行
def show_time(f): # 一定要注意写成变量形式
start = time.time()
f()
end = time.time()
print(f.__name__, 'speed is %s' % (end - start))
# 调用的时候也要函数名写成变量的样子进行执行
show_time(f1)
不写成其他函数,并且不直接修改原函数实现原函数添加新的功能:就需要装饰器
# 装饰器 为之前的函数添加新的功能 添加显示执行时间的函数
def f2_show_time(f):
def inner():
start = time.time()
f()
end = time.time()
print(f.__name__, 'speed is %s' % (end - start))
return inner # 返回函数地址
# 注意格式 f2_show_time()函数是f1()函数的装饰器,为f1添加新的功能,但是不改变f1函数
f1 = f2_show_time(f1)
f1()
假设,装饰器也早就写好了,想直接给某个函数添加新的功能: @装饰器名
# 如果我们想给f2() 添加新的功能直接
@f2_show_time # 这句就等价于 f2= show_time(f2) 重要
def f2():
print("I want to add showtime function to ", f2.__name__)
time.sleep(2)
f2() #
之前的函数以及装饰器没有传参,如果想进行传参:修改inner()就可
# 带有参数的
# 装饰器 为之前的函数添加新的功能 添加显示执行时间的函数
def f3_show_time(f):
def inner(x, y):
start = time.time()
f(x, y)
end = time.time()
print(f.__name__, 'speed is %s' % (end - start))
return inner # 返回函数地址
# 如果我们想给f3() 添加新的功能直接
@f3_show_time # 这句就等价于 f2= show_time(f2) 重要
def f3(a, b):
print("I want to add showtime function to ", f3.__name__)
print('a+b=', a + b)
time.sleep(2)
f3(8, 9) # hello speed is 2.0124034881591797
要点:
- 装饰器是双层函数,外层函数参数为函数名
- 装饰器是双层函数,内层函数的参数,视原函数参数而定。注意:return inner 不带括号。
- 将装饰器添加到原函数。方式1:原函数=装饰器(原函数) 。方式2:在原函数前 @装饰器。
还没有评论,来说两句吧...