"""
装饰器 - 用装饰函数去执行被装饰函数并添加额外的功能 - 代理模式
程序中跟正常业务逻辑没有必然联系而且会重复使用的功能称为横切关注功能
横切关注功能不应该写在业务逻辑代码上而应该使用装饰器或中间件来完成
这种编程理念也被称为面向切面编程(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()
装饰器
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 使用装饰器装饰函数,程序运行后出现AssertionError: View function mapping is...
- 这是关于Python装饰器系列文章的第二篇,第一篇在这里如何正确地实现 Python 装饰器 上一篇博文中,我列出...