python函数式编程3(装饰器的深入理解)

python函数式编程3(装饰器的深入理解),第1张

概述一、什么是装饰器1、python中装饰器可以理解为AOP编程,有点类似Spring中的注解,在不改变原函数或类的基础上,对函数或类添加额外(自己需求补充)的功能。2、装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 一、什么是装饰器1、python中装饰器可以理解为AOP编程,有点类似Spring中的注解,在不改变原函数或类的基础上,对函数或类添加额外(自己需求补充)的功能。2、装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。3、有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。4、比如我们要给每一个函数新增一个打印logger日志,我们就可以使用装饰器,在不修改原函数的前提下,新增功能又能做到代码的解耦。二、装饰器的几个原则及学习装饰器必要的知识储备

1、装饰器的几个原则

1.不能修改被装饰的函数2.不能修改被装饰的函数的调用方式

2、学习装饰器必要的知识

1.函数的理解 不太熟悉的可以参考我之前写的文章2.高阶函数 不太熟悉的可以参考我之前写的文章3.函数的嵌套 不太熟悉的可以参考我之前写的文章三、装饰器的演变过程

1、定义一个装饰器(计算函数执行时间)

import timedef 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、解答上面的代码

1.定义的装饰器是一个高阶函数,被装饰的函数作为参数传递进去2.在满足装饰的原则下,我们把高阶函数执行后重新赋值给foo函数3.foo()函数的执行就没改变原有函数的调用方式

5、使用装饰器**@**

上面第四点中2和3步骤在python中直接使用**@**语法糖来处理

@timerdef bar():    time.sleep(2)    print('主函数')  if __name__ == "__main__":    bar()
四、装饰器中传递参数
import timedef 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@timerdef foo(name, gender):  time.sleep(3)  print(name)  print(gender)if __name__ == "__main__":  foo('张三', gender='男')
五、使用类来作装饰器

创建一个数据库 *** 的log的装饰器

1、具体实现代码

from functools import wrapsfrom 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(装饰器的深入理解)全部内容,希望文章能够帮你解决python函数式编程3(装饰器的深入理解)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1183725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存