zoukankan      html  css  js  c++  java
  • python学习-day20、装饰器【图片缺失可看】印象笔记博客备份

    前言:

       装饰器用于装饰某些函数或者方法,或者类。可以在函数执行之前或者执行之后,执行一些自定义的操作。

       1、定义:装饰器就是一个函数,为新定义的函数。把原函数嵌套到新函数里面。以后就可以在执行新函数的过程中,同时执行旧函数,实现自定义操作。

    装饰器的语法:

      

    2、应用装饰器:@符号

     

    1.1  无参数的装饰器

    #装饰器架构:
    def outter(func):
        def inner():
            print('hello world')
            print('hello world')
            print('hello world')
            r=func()
            print('end')
            print('end')
            print('end')
            return r
        return inner
    
    @outter
    def f1():
        print('F1')
    >>>
    hello world
    hello world
    hello world
    F1
    end
    end
    end
    
    #开放封闭原则:不在原函数的修改代码基础上,实现函数执行前后新的功能
    #装饰器架构:
    
    def outter(func):
        #原来那个f1函数
        def inner():
            print('hello world')
            print('hello world')
            print('hello world')
            #原f1函数
            r=func()    #r=None  r=f1()
            print('end')
            print('end')
            print('end')
            return r        #f1=inner →f1()=inner()
        return inner
    #@outter
    def f1():
         print('F1')
    
    #1、执行outter函数,并且将其下面的函数名(f1)当做参数传入装饰器内:f1=func
    #2、将outter的返回值,重新赋值给f1→相当于f1执行另一个函数【相当于f1=inner内存地址】所以f1()相当于执行inner()
        #新f1函数拿到一个return值:r f1=r
    #总结:
    # 把原函数分装到另一个函数里面。在不改变原函数的基础上。在原函数执行前,后操作其他内容。
    #拆解过程
    f2=outter(f1)   #f2=inner()的内存地址
    result=f2()     #执行inner函数,并把返回值赋值给result
    print(result)   #打印执行结果
    #然后把f1进行重新赋值。f1=f2   相当于:f1执行inner函数
    >>>
    hello world
    hello world
    hello world
    F1
    end
    end
    end
    None
    

    总结:

      1、只要函数应用上装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数

      

    1.2 带2个参数的装饰器

    缺点:

       原函数有几个参数,装饰器就得有几个参数,很不方便。所以可以考虑引入可变参数和关键字参数。*args,**kwargs.这样可以接受无限多的参数。

    这样无法满足对于参数的灵活控制。希望写一个装饰器就可以应用到多个函数。

      如果inner函数可以接收任意个参数的话,就无需其他函数强制修改为何装饰器一致参数的工作。

    1.3、多个参数的装饰器

    通过装饰器可变参数,可以解决大部分参数问题。

    不足点:只能实现多个函数调用一个装饰器。如果一个函数调用多个装饰器?

    1.4、一个函数调用多个装饰器。

    1.5、装饰器流程梳理

      ①、函数应用一个装饰器

      原函数等价于→inner函数。func是原来的index函数

    @outer的意思:

    1、执行outer函数,将index函数作为参数传递。

    2、将outter的返回值。重新赋值给index

    执行流程:

    单层:

     

    做个类比:

    @outter+index=inner函数

    两层装饰器函数


     

     
  • 相关阅读:
    iOS 改变同一个label中多行文字间的距离
    iOS改变UITableViewCell的分割线frame和颜色
    iOS动画实现改变frme和contenOffset
    iOS判断数组不为空
    jQueryMobile控件之ListView
    jQueryMobile控件之展开与合并
    jQueryMobile控件之页面切换
    jQueryMobile控件之按钮
    jQueryMobile控件之复选框
    jQueryUI 之控件们
  • 原文地址:https://www.cnblogs.com/laixiaoyun/p/6142536.html
Copyright © 2011-2022 走看看