import functools
def func(text):
if isinstance(text, str): # 判断是否带参数
def decorator(log):
@functools.wraps(log) # 给wrapper函数继承被装饰的函数的__name__属性
def wrapper(*args, **kwargs):
print('%s %s():' % (text, log.__name__))
print('begin call')
log(*args, **kwargs)
print('end call')
return wrapper
return decorator
else:
@functools.wraps(text)
def wrapper(*args, **kwargs):
print('execute1 %s():' % (text.__name__))
print('begin call')
text(*args, **kwargs)
print('end call')
return wrapper
@func('execute1') # 这一步的过程:now1 = func('execute1')(now1) = decorator(now1) = wrapper
def now1():
print('2020')
@func
def now2():
print('2020')
now1()
now2()
# 写一个可用于任何函数的装饰器,可用于计算该函数执行所用时间
# -*- coding: utf-8 -*-
import time, functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
start = time.time()
x = fn(*args, **kwargs)
end = time.time()
print('%s executed in %s ms' % (fn.__name__, end - start))
return x
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('测试失败!')
装饰器
最新推荐文章于 2024-09-15 22:31:42 发布