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

    一.闭包函数

    闭包函数:内部函数包含对外作用域而非全局作用域的引用

    作用:传参(通过参数的形式,通过闭包函数)

    def outter():
        n=1
        def inner():
            x=n
            return x
        return inner
    a=outter()    # 将inner的函数地址赋值给a
    a()  # 执行inner函数

    二.简易版装饰器

    什么是装饰器:

      给被装饰对象添加一个新的功能的工具

    装饰器使用的原则(开放封闭原则):

      开放:对功能的扩展开放

      封闭:对源码,调用方式等修改的封闭

    装饰器必须遵循的两个原则:

      1.不可改变装饰对象源码

      2.不改变装饰对象的调用方式

    ps:装饰对象是个可调用对象(callable),装饰器也是个可调用对象 

    三.升级版装饰器

    四装饰器语法糖

    装饰器语法糖:就是在被装饰对象上方写上@+装饰器名称,这就相当于把临近的函数当作参数自动传入装饰器函数中

    @outter  # 会将inner当作参数传入调用outter
    def inner():
        pass

    五装饰器模板

     无参装饰器:

    from functools import wraps
    def outter(func):
        @wraps(func)
        def inner(*args,**kwargs):
            #执行被装饰函数前的操作    
            res = func(*args,**kwargs)
            #执行被装饰函数后的操作
            return res
        return inner    

    有参装饰器

    from functools import wraps
    def wrappers(name):
        def outter(func):
            @wraps(func)
            def inner(*args,**kwargs):
                    if name == 'zhang':
                    # 执行被装饰函数之前你可以做的操作
                    res = func(*args,**kwargs)  # * **在实参中使用
                    # 执行被装饰函数之后你可以做到操作
                    return res
            return inner
        return outter

    ps:其中用到装饰器修复技术起作用为:

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

      2.返回原来函数的注释

    五.多层装饰器

    from functools import wraps
    def outter1(func1):
        print('加载了outter1')
        @wraps(func1)
        def wrapper1(*args,**kwargs):
            print('执行了wrapper1')
            res1=func1(*args,**kwargs)
            return res1
        return wrapper1
    def outter2(func2):
        print('加载了outter2')
        @wraps(func2)
        def wrapper2(*args,**kwargs):
            print('执行了wrapper2')
            res2=func2(*args,**kwargs)
            return res2
        return wrapper2
    def outter3(func3):
        print('加载了outter3')
        @wraps(func3)  # 放在内置函数正上方
        def wrapper3(*args,**kwargs):
            print('执行了wrapper3')
            res3=func3(*args,**kwargs)
            return res3
        return wrapper3
    @outter1  # index = outter1(wapper2)
    @outter2  # wrapper2 = outter2(wrapper3)
    @outter3  # wrapper3 = outter3(最原始的index函数内存地址)
    def index():
        print('from index')

    结果是:
    加载了outter3
    加载了outter2
    加载了outter1
    执行了wrapper1
    执行了wrapper2
    执行了wrapper3
    from index


    顺序:装饰的时候从下到上执行

  • 相关阅读:
    JUnit中的设计模式:组合模式 Composite
    Activity在屏幕显示的方向切换
    Jenkins插件之有用
    Jenkins插件之Dashboard和wall display
    python技巧32[常用技巧集]
    Jenkins插件之构建与MSBuild
    Jenkins插件之Publish Over SSH/CIFS/FTP
    使用devenv/MSBuild在命令行编译单个project
    Jenkins中执行batch和Python
    python翻译[排序高级]
  • 原文地址:https://www.cnblogs.com/z929chongzi/p/11173267.html
Copyright © 2011-2022 走看看