"""
装饰器 - 用装饰函数去执行被装饰函数并添加额外的功能 - 代理模式
程序中跟正常业务逻辑没有必然联系而且会重复使用的功能称为横切关注功能
横切关注功能不应该写在业务逻辑代码上而应该使用装饰器或中间件来完成
这种编程理念也被称为面向切面编程(AOP - Aspect Oriented Programming)
"""
from functools import wraps
from time import time, sleep
from random import randint
class RecordTime(object):
def __init__(self, output):
self.output = output
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time()
ret_value = func(*args, **kwargs)
self.output(func.__name__, time() - start)
return ret_value
return wrapper
"""
def record_time(output):
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time()
ret_value = func(*args, **kwargs)
output(func.__name__, time() - start)
return ret_value
return wrapper
return decorate
"""
def log_to_db(fn, duration):
pass
def log_to_file(fn, duration):
with open('result.log', 'a') as fs:
fs.write('%s: %.3f秒\n' % (fn, duration))
#@record_time(print)
@RecordTime(print)
def foo():
print('hello, world!')
sleep(randint(1, 5))
def main():
print(foo.__name__)
for _ in range(3):
# 此处调用foo函数真正执行的是wrapper函数
foo()
# 取消装饰器(获得被装饰之前的函数)
foo2 = foo.__wrapped__
for _ in range(3):
# 此处调用的才是被装饰之前的真正的foo函数
foo2()
if __name__ == '__main__':
main()
网友评论