装饰器
- 如果我们要增强函数的功能,但又不希望修改
原
函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator); - 本质上,decorator就是一个返回函数的高阶函数;
@functools.wraps(func)是让装饰器记住的原始函数func 的 __name__
等属性的值,并传入装饰器所定义的新函数中;- round() 方法返回浮点数 x 的四舍五入值,用法:round( x [, n] ),n 表示保留的小数位数,省略时为0,返回一个整数;
>>> type(round(3.97)) <class 'int'> >>> type(round(3.97,1)) <class 'float'>
- 利用time.time()方法,我们可以计算两个时间点之间的间隔,返回当前时间的年月日
>>> print('%s-%s-%s %s:%s:%s' % (time.localtime().tm_year,time.localtime().tm_mon,time.localtime().tm_mday,time.localtime().tm_hour,time.localtime().tm_min,time.localtime().tm_sec)) 2019-7-3 16:31:14
设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import time,functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
# 获取开始时间
start = time.time()
# 运行函数fn()
f = fn(*args, **kw)
# 获取结束时间
end = time.time()
# 打印函数运行时间
print('%s executed in %s ms' % (fn.__name__, round((end - start)*1000)))
# 返回函数运行结果
return f
return wrapper
@metric
def fast(x, y):
time.sleep(0.0012)
return x + y;
@metric
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z;
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')