python
中装饰器能够理解为AOP
编程,有点相似Spring
中的注解,在不改变原函数或类的基础上,对函数或类添加额外(本身需求补充)的功能。一、装饰器的几个原则python
二、学习装饰器必要的知识数据库
一、定义一个装饰器(计算函数执行时间)编程
import time
def timer(func):
def wrapper():
start_time = time.time()
res = func()
end_time = time.time()
print('程序运行时间:{0}'.format(end_time - start_time))
return res
return wrapper
复制代码
二、定义一个要执行的函数app
def foo():
time.sleep(3)
print('主函数')
复制代码
三、根据上面几个原则,咱们来调用函数foo
函数
if __name__ == "__main__":
# 1.timer函数中传递函数foo进去
# 2.为了避免改变函数的调用方式,将timer函数的返回值(函数)赋值给变量foo
foo = timer(foo) # 前面foo是新定义的变量,timer中的foo是上面定义的foo函数
foo() # timer是一个高阶函数,返回的是一个函数
复制代码
四、解答上面的代码学习
foo
函数foo()
函数的执行就没改变原有函数的调用方式五、使用装饰器**@
**spa
上面第四点中2和3步骤在
python
中直接使用**@
**语法糖来处理日志
@timer
def bar():
time.sleep(2)
print('主函数')
if __name__ == "__main__":
bar()
复制代码
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print('执行时间:{0}'.format(end_time - start_time))
return res
return wrapper
@timer
def foo(name, gender):
time.sleep(3)
print(name)
print(gender)
if __name__ == "__main__":
foo('张三', gender='男')
复制代码
建立一个数据库操的
log
的装饰器code
一、具体实现代码orm
from functools import wraps
from datetime import datetime
# 建立一个类的装饰器
class Log(object):
def __init__(self, logfile='log.log'):
self.logfile = logfile
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
self.writelog(*args, **kwargs)
return func(*args, **kwargs)
return wrapper
# 把日志写到本地
def writelog(self, *args, **kwargs):
time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_str = time + ' 操做人:{0[0]} 进行了【{0[1]}】操做'.format(args)
# 写入本地文件中
with open(self.logfile, 'a', encoding='utf8') as file:
file.write(log_str + '\n')
@Log()
def printLog(name, type):
print('姓名:{0},type:{1}'.format(name, type))
if __name__ == "__main__":
printLog('张三', '查询')
printLog('李四', '新增')
复制代码
二、执行结果(本地文件夹下多一个文件)
2018-06-24 10:47:40 操做人:张三 进行了【查询】操做
2018-06-24 10:47:40 操做人:李四 进行了【新增】操做
复制代码