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

栏目: Python · 发布时间: 6年前

内容简介:上面第四点中2和3步骤在创建一个数据库操的
  • 1、 python 中装饰器可以理解为 AOP 编程,有点类似 Spring 中的注解,在不改变原函数或类的基础上,对函数或类添加额外(自己需求补充)的功能。
  • 2、装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
  • 3、有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
  • 4、比如我们要给每一个函数新增一个打印logger日志,我们就可以使用装饰器,在不修改原函数的前提下,新增功能又能做到代码的解耦。

二、装饰器的几个原则及学习装饰器必要的知识储备

三、装饰器的演变过程

  • 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(装饰器的深入理解)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

注意力经济: 如何把大众的注意力变成生意

注意力经济: 如何把大众的注意力变成生意

吴修铭 / 中信出版集团股份有限公司 / 2018-4-1 / 69

编辑推荐 这本书由万维钢作序,并在《得到》日课中多次推荐!中文版未上市之前,中文前沿媒体就在力推这本书!关于注意力争夺战的历史和现在,作者给了权威的梳理和定位! 百年来,在争夺注意力的战场上,媒体、广告、商人、企业和大众成为博弈的主角。商人是如何在注意力争夺战中获利的?媒体是如何在改变报道形式的?广告是如何进化的?以及,营销是如何变得随处可见、无孔不入的呢?这本书讲述了令商人或企业从吸......一起来看看 《注意力经济: 如何把大众的注意力变成生意》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换