zoukankan      html  css  js  c++  java
  • python-装饰器

    python装饰器

    Python装饰器看起来类似Java中的注解,然而和注解并不相同,不过同样能够实现面向切面编程。
    想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。

    • 闭包
      在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
      简单理解就是函数内部返回一个函数
    def func():
        massage = "This is a closure message"
    
        # 这是内嵌函数
        def closure_func():
            # 可以使用外部函数的变量
            print(massage)
            pass
        return closure_func
        pass
    
    # 获取一个闭包
    closure = func()
    # 输出信息:This is a closure message
    closure()
    

    massage 是一个局部变量,在func函数执行之后应该就不会存在了。但是嵌套函数引用了这个变量,将这个局部变量封闭在了嵌套函数中,这样就形成了一个闭包。

    • 装饰器的常用场景:
      1、引入日志
      2、函数执行时间统计
      3、执行函数前预备处理
      4、执行函数后清理功能
      5、权限校验等场景
      6、缓存
      7、事务处理
      这里模拟一个函数执行时间统计的场景
    import time
    
    
    def run_time(func):
    
        # 这是一个闭包
        def wapper(*args, **kwargs):
            # 开始时间
            start = time.time()
            func(*args, **kwargs)  # 运行函数
            # 结束时间
            end = time.time()
            print(f"run time:{end - start}")
            pass
        return wapper
        pass
    
    # 这是要装饰的函数
    @run_time
    def func():
        time.sleep(2)
        pass
    
    func()
    

    结果:

    run time:2.00065541267395
    
    • 带参数的装饰器
      和不带参数的装饰器基本一样的
    import time
    
    
    def run_time(func):
    
        # 这是一个闭包
        def wapper(*args, **kwargs):
            # 开始时间
    
            start = time.time()
            func(*args, **kwargs)  # 运行函数
            # 结束时间
            end = time.time()
            print(f"run time:{end - start}")
            pass
        return wapper
        pass
    
    # 这是要装饰的函数
    @run_time
    def func(i):
        time.sleep(i)
        pass
    
    func(3)
    

    结果:

    run time:3.0009799003601074
    
  • 相关阅读:
    Git 学习
    js模块化编程之彻底弄懂CommonJS和AMD/CMD!
    浅析JS中的模块规范(CommonJS,AMD,CMD)
    js实现获取两个日期之间所有日期最简单的方法
    jQuery 中 attr() 和 prop() 方法的区别
    判断某个元素是否在数组的对象中存在
    获取两个数组中不同的元素
    Web前端的缓存机制(那些以代价换来的效率)
    前端技术栈(概览)
    使用layer 弹出对话框 子父页面相互参数传递 父页面获取子页面参数实例
  • 原文地址:https://www.cnblogs.com/hziwei/p/12925715.html
Copyright © 2011-2022 走看看