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.返回原来的函数的注释

  • 相关阅读:
    Activity
    清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)
    Android-- FragmentStatePagerAdapter分页
    使用NServiceBus开发分布式应用
    SOA、ESB、NServiceBus、云计算 总结
    ESB简介及选型(转) http://www.cnblogs.com/skyme/archive/2012/08/06/2623414.html
    C# 版dll 程序集合并工具
    83款 网络爬虫开源软件
    13个.Net开源的网络爬虫
    IE6浏览器的bug问题及相关解决的方法
  • 原文地址:https://www.cnblogs.com/xiaowangba9494/p/11173011.html
Copyright © 2011-2022 走看看