• 自创最精简的python装饰器


    个人心血原创,欢迎转载,请注明作者和出处。否则依法追究法律责任!!!!

    author:headsen  chen  

    date:2018-03-21  10:37:52

    代码:

    代码解析过程:
    1,def  w函数,分配内存,存储变量:门牌号:w,主体内容:(print(“www”);return a),仅分配内存和标识变量名,不做任何其他的操作。

    2,def  f 函数,分配内存,存储变量,门牌号:f,主体内容: (print(‘fff’)),作用同上,f 本身代表的函数名,打印出来就是内存地址!!!一定要理解这个

    3,g=w(f),细分成三步完成:

    3.1,f函数作为实参传递到w函数中,变成了w(f),此时的w (f)函数成了如下的形式:

                 

    3.2,执行新的w (f)函数:即 w(f),结果是打印出 www,并自带返回值 f ,这个返回值就之前第2步定义的f函数的函数名,也就是f 函数的内存地址

    3.3,执行新变量的赋值过程:g=w(f)  ,也就是将f函数的内存地址赋值给g这个变量(此时的 f 函数的内容主体等于有两个变量在引用它,即 f 和 g)!!!!!! 一定要理解这个

    4,g(),运行g()函数,也就是运行3.3步骤中的变量主体内容,由于它调用的是和 f 函数相同的内容主体,此时执行的也就是原来的 f() 函数。

     

    将上述代码写成python装饰器的形式    

    解说:

    1,@w  等同于  f = w ( f )

    2,这里的 f 被重新定义了,以后无论几次引用都会启用新的f 函数。新的f 函数的作用:

          print  (‘www’)

          f () 

         实现了比原来的f 函数的更多的功能,这就是装饰器的作用:在不改变原代码和调用的情况下,给函数增加新的功能

    评论:能否理解看个人能力。我自己也是看了多遍的视频及他人博客,前后花了好多的时间总结揣摩,最后总结出来的。如果我的这篇装饰器还看不懂,那就找不到更深入检出的文章了。

               一旦你理解了,你就会有一种拨云雾而见青天的感觉。

    扩展:给一个函数添加多个装饰器:

    执行后的效果:

    给一个带参数的函数添加装饰器:

    代码如下:

    代码解析过程:

    1,def  y(n)  定义一个 y 函数,分配变量名y 和内存地址,及内容主体。

    2,def  f(a)  定义一个 f 函数,分配变量名f 和内存地址,及内容主体。

    3,g = y(f) ,细分为三步

         3.1,将f 函数当成实参传递给y(n)函数,此时的y 函数变成了:

                  

          3.2,执行 y(f) 函数,先定义了j这个变量,整个y函数没有任何的执行过程,只定义了一个变量 j,取j作为y函数的返回值,即 print(y)=j.而j本身就是函数名,对应这个一个内容主体。

          3.3,g = y(f), 将上一步的 返回值 j (j函数的内存地址)赋值给g

    4,g(3) ,将参数3传递到g的内存地址中去运行:等于实际运行的是:

                

            4.1 ,打印:yyy

            4.2, 执行return  f(3),调用f(3) 函数,打印:fff  3,当执行一个函数的时候,若return的内容是一个函数时,该函数会被正常的执行,若return的内容是一个定量或者没有的时候,就不会在屏幕上显示结果但作为函数的返回值真实存在。

                   

     

     补充:python中的函数执行:

    1,函数内容主体中执行:

                    执行结果:

    2,在函数的return中执行:

                 执行结果:

    总结:当一个函数执行的时候,当该函数的return内容是一个可执行的程序的时候,该程序也会正常的执行。不过此时的返回值的概念是:

     

    =====》分别打印两个函数的内存地址

     

    =====》 尽管这次return的是a() ,但由于b()函数并没有调用,仍然还是打印两个函数的内存地址。

     

    ====》执行结果: 因为b()函数里面是空的。而return的a是个变量,就是一个内存地址。

     

    ====》 此时运行b函数,则b函数的主体会运行,return里面的如果是可执行程序也会运行,效果如下:

     

          

  • 相关阅读:
    删除表数据drop、truncate和delete的用法
    List,DataTable实现行转列的通用方案
    C#正则表达式简单限制输入11位手机号
    Oracle数据库byte存放汉字,9个汉字x3=27个字节
    SQL 语句
    $("p").fadeOut("fast")设置淡出效果
    神奇的 toLocaleString
    C#中精确计时的一点收获
    Web service stop after running serveral hours
    SQL Server中like匹配下划线的方法
  • 原文地址:https://www.cnblogs.com/kaishirenshi/p/8615617.html
Copyright © 2020-2023  润新知