CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
jackfrued

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: jackfrued/Python-100-Days
Path: blob/master/Day16-20/code/example09.py
Views: 729
1
"""
2
装饰器 - 装饰器中放置的通常都是横切关注(cross-concern)功能
3
所谓横切关注功能就是很多地方都会用到但跟正常业务又逻辑没有必然联系的功能
4
装饰器实际上是实现了设计模式中的代理模式 - AOP(面向切面编程)
5
"""
6
from functools import wraps
7
from random import randint
8
from time import time, sleep
9
10
import pymysql
11
12
13
def record(output):
14
15
def decorate(func):
16
17
@wraps(func)
18
def wrapper(*args, **kwargs):
19
start = time()
20
ret_value = func(*args, **kwargs)
21
output(func.__name__, time() - start)
22
return ret_value
23
24
return wrapper
25
26
return decorate
27
28
29
def output_to_console(fname, duration):
30
print('%s: %.3f秒' % (fname, duration))
31
32
33
def output_to_file(fname, duration):
34
with open('log.txt', 'a') as file_stream:
35
file_stream.write('%s: %.3f秒\n' % (fname, duration))
36
37
38
def output_to_db(fname, duration):
39
con = pymysql.connect(host='localhost', port=3306,
40
database='test', charset='utf8',
41
user='root', password='123456',
42
autocommit=True)
43
try:
44
with con.cursor() as cursor:
45
cursor.execute('insert into tb_record values (default, %s, %s)',
46
(fname, '%.3f' % duration))
47
finally:
48
con.close()
49
50
51
@record(output_to_console)
52
def random_delay(min, max):
53
sleep(randint(min, max))
54
55
56
def main():
57
for _ in range(3):
58
# print(random_delay.__name__)
59
random_delay(3, 5)
60
# for _ in range(3):
61
# # 取消掉装饰器
62
# random_delay.__wrapped__(3, 5)
63
64
65
if __name__ == '__main__':
66
main()
67
68