# -*- coding:utf-8 -*-
# 增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,
# 这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
# 本质上,decorator就是一个返回函数的高阶函数,
# 装饰器的主要功能在于不改变原有函数极其调用的基础上扩展函数功能。
import time
import functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
start = time.time()
print('%s exectued in %s ms' % (fn.__name__, 1000*(time.time() - start)))
return fn(*args, **kw)
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)
print(f)
print(s)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')
def log(text=''):
def test_log(func):
@functools.wraps(func)
def inner(*args, **kw):
print('%s begin call: %s' % (text, func.__name__))
c = func(*args, **kw)
print('%s end call %s ' % (text, func.__name__))
return c
return inner
return test_log
@log() # 此处如果没有()将无法执行
def f():
pass
@log('execute')
def d():
pass
f()
d()
Python 装饰器
最新推荐文章于 2024-03-04 15:55:42 发布