内容简介:上面第四点中2和3步骤在创建一个数据库操的
-
1、
python
中装饰器可以理解为AOP
编程,有点类似Spring
中的注解,在不改变原函数或类的基础上,对函数或类添加额外(自己需求补充)的功能。 - 2、装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
- 3、有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
- 4、比如我们要给每一个函数新增一个打印logger日志,我们就可以使用装饰器,在不修改原函数的前提下,新增功能又能做到代码的解耦。
二、装饰器的几个原则及学习装饰器必要的知识储备
-
1、装饰器的几个原则
- 1.不能修改被装饰的函数
- 2.不能修改被装饰的函数的调用方式
-
2、学习装饰器必要的知识
- 1.函数的理解 不太熟悉的可以参考我之前写的文章
- 2.高阶函数 不太熟悉的可以参考我之前写的文章
- 3.函数的嵌套 不太熟悉的可以参考我之前写的文章
三、装饰器的演变过程
-
1、定义一个装饰器(计算函数执行时间)
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 复制代码
-
2、定义一个要执行的函数
def foo(): time.sleep(3) print('主函数') 复制代码
-
3、根据上面几个原则,我们来调用函数
foo
if __name__ == "__main__": # 1.timer函数中传递函数foo进去 # 2.为了不改变函数的调用方式,将timer函数的返回值(函数)赋值给变量foo foo = timer(foo) # 前面foo是新定义的变量,timer中的foo是上面定义的foo函数 foo() # timer是一个高阶函数,返回的是一个函数 复制代码
-
4、解答上面的代码
foo foo()
-
5、使用装饰器**
@
**
上面第四点中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
的装饰器
-
1、具体实现代码
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('李四', '新增') 复制代码
-
2、执行结果(本地文件夹下多一个文件)
2018-06-24 10:47:40 操作人:张三 进行了【查询】操作 2018-06-24 10:47:40 操作人:李四 进行了【新增】操作 复制代码
以上所述就是小编给大家介绍的《python函数式编程3(装饰器的深入理解)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 深入理解 JavaScript 函数
- 【4】JavaScript 基础深入——函数、回调函数、IIFE、理解this
- 深入理解 Java 函数式编程,第 5 部分: 深入解析 Monad
- 深入学习javascript函数式编程
- [译] 深入理解 JavaScript 回调函数
- 重读《深入理解ES6》—— 函数
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
精通CSS(第2版)
[英] Andy Budd、[英] Simon Collison、[英] Cameron Moll / 陈剑瓯 / 人民邮电出版社 / 2010-5 / 49.00元
本书汇集了最有用的CSS技术,介绍了CSS的基本概念和最佳实践,结合实例探讨了图像、链接和列表的操纵,还有表单设计、数据表格设计、纯CSS布局等核心CSS技术。此外,书中着眼于创建跨浏览器的技术,讨论了bug及其捕捉和修复技术,还将所有技术组合成两个精彩的实例,讲述这些技术的工作原理和实际用法。 本书适合具有HTML和CSS基础知识的读者阅读。一起来看看 《精通CSS(第2版)》 这本书的介绍吧!