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

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里面的如果是可执行程序也会运行,效果如下:

自创最精简的python装饰器的更多相关文章

  1. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

  2. Python装饰器完全解读

    1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨——人生苦短,我用Python. 2 初步理解装 ...

  3. python装饰器2

    装饰模式有很多经典的使用场景,例如插入日志.性能测试.事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的.下面就一步步看看Python中的装饰器. 一个简单 ...

  4. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  5. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  6. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  7. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  8. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  9. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

随机推荐

  1. Flask從入門到入土(五)——Flask与数据库

    import sqlite3 def init_db(): sql = 'create table user(id INT,name TEXT)' conn = sqlite3.connect(&qu ...

  2. hdu1800 贪心+hash+真的有毒

    这道题用map<string,int>TLE到死.这题又是一道毒题,看了评论,居然可以用int读入,而且网上还有用排序的....用int的连前导0都不需要处理了 说下贪心吧,每把扫帚一定要 ...

  3. CodeForces-748D 贪心

    这题的思维难度不是很大,属于编程实现细节处理较多的题. 暂且把每个字符串的"beauty"称为魅力值,用一个优先队列数组将同一个字符串的所有魅力值保存,通过map将不同字符串编号, ...

  4. 算法提高 金属采集 树形DP

    题目链接:金属采集 思路:d(i, j)表示在以i为根结点的子树中使用j个机器人的最小花费.设v为u的一个子节点,从节点i使用k个机器人收集以v为根结点的能量,状态转移方程为d(u, i) = min ...

  5. 【推荐】开源项目minapp-重新定义微信小程序的开发

    minapp 重新定义微信小程序的开发 官网:https://qiu8310.github.io/minapp/ 作者:Mora minapp 重新定义微信小程序的开发 使用 用 npm 安装命令行工 ...

  6. 恢复Mysql丢失的root用户权限

      今天安装了某个程序时, 由于程序很傻X的 新建了一个 root@localhost 用户 并把 root权限全部改为了 no 这下 我也 傻X 了.服务器上所有程序都崩溃了. 此时即使用root用 ...

  7. Java中equal和==区别及String创建过程

    Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...

  8. Windows10系统故障检测你知道多少-上海IT33

    Windows 10作为微软公司最新的一款操作系统,从使用的方便和界面的整洁上来说,固然是很好的,但是其因为隐私问题,致使很多人不惜一切代价想要远离Windows 10这款操作系统.尽管Windows ...

  9. http缓存(http caching)

    通过使用缓存web网站和web应用的性能能够得到显著的提升.Web caches能够减小延迟和网络流量,从而缩短展示资源所花费的时间. 在http中控制缓存行为的首部字段是Cache-Control, ...

  10. rpm检验是否被改动过

    参考原文http://vbird.dic.ksu.edu.tw/linux_basic/0520rpm_and_srpm.php#rpmmanager_verify   rpm -qVa   (当然可 ...