zoukankan      html  css  js  c++  java
  • 闭包函数和装饰器

    一、闭包函数

      1.定义在函数内部的函数

      2.内部函数引用了外部函数名称空间作用域的名字

      主要满足上面的两点都叫做闭包函数

      

      顾名思义,函数里面包了个函数

      闭包用于给里面函数传参

      函数传参两种情况:

            1、直接传参

            2、闭包

      闭包函数运行步骤图:

    二、装饰器

      1.含义

        用修饰器原因:修饰函数,是函数更好用(添加新的功能)

        因旧函数添加新功能,不可改调用方式,又不能改旧函数(被修饰对象)源代码

        即两个原则

          1.不改变被装饰对象源代码

          2.不改变被装饰对象(可调用对象)调用方式

    def index(): 
          print('x')       #原始函数    
    #outter+inner函数组成index  函数的装饰器
    def outter(func)      #  func = 最原始的index函数的内存地址
        def inner(*args,**kwargs)
            func()       #func = index函数的内存地址,加()直接调用
            print('y')
        return inner  
    index = outter(index)  # outter (最原始的index函数内存地址)
    # index指向 inner函数的内存地址
    index()  

      2.装饰器 语法糖

       作用:不改变最原始函数的

      @+下层函数名   #  函数名 = 修饰函数名(函数名)

        装饰器在装饰的时候 顺序从下往上

        装饰器在执行的时候 顺序从上往下

    @outter1  # index = outter1(func2)
    @outter2  # func2 = outter2(func1)
    @outter3  # func1 =  outter3(index)
    def index():
        pass

      3.装饰器固定格式

    1 def outter(func):
    2     def inner(*args,**kwargs):
    3         print('执行被装饰函数之前 你可以做的操作')
    4         res = func(*args,**kwargs)
    5         print('执行被装饰函数之后 你可以做的操作')
    6         return res
    7     return inner

        4、装饰器修复技术

        from functools import wraps

        def  outter(func):

          @wraps(func)

          def ...

        1.返回原来的函数的函数名

        2.返回原来的函数的注释

  • 相关阅读:
    input 框变成不可编辑的。
    git 首次往远程仓库提交项目过程。(使用idea操作)
    nacos 导入项目配置(yml文件)步骤
    instr MySQL数据库函数用法
    遍历 map 的方法
    基于分布式思想下的rpc解决方案(1)
    深入理解通信协议-(1)
    Tomcat(3)--性能优化
    并发编程(5)--并发容器
    并发编程(4)--显示锁和AQS
  • 原文地址:https://www.cnblogs.com/xiaowangba9494/p/11173011.html
Copyright © 2011-2022 走看看