先讲一下python中的@符号

看下面代码

  1. @f
  2. @f2
  3. def fun(args, args2, args3, args4, ……):
  4. pass

上面代码相当于

  1. def fun(args, args2, args3, args4, ……):
  2. pass
  3. fun = fun(f2(fun))
  1. def now():
  2. print('2016-06-03')
  3. n = now
  4. n2 = now()
  5. n2 #2016-06-03
  6. n() #2016-06-03
  7.  
  8. #函数对象有一个name属性,可以拿到函数的名字
  9. print(n.__name__) #n这个变量指向的函数名为now,输出结果为now
  10.  
  11. def log(func):
  12. def wrapper(*args, **kw):
  13. print('call %s():' % func.__name__)
  14. return func(*args, **kw)
  15. return wrapper
  16. @log
  17. def now():
  18. print('2016-06-03')
  19. now()
  20.  
  21. #如果decorator本身需要传入参数,那就要编写一个返回decorator的高阶函数,比如自定义log的文本:
  22. def log(text):
  23. def decorator(func):
  24. def wrapper(*args, **kw):
  25. print('%s %s():' % (text, func.__name__))
  26. return func(*args, **kw)
  27. return wrapper
  28. return decorator
  29. @log('rain:')
  30. def now():
  31. print('2016-06-03')
  32. now()
  33. #但是像上面那样优化,装饰后的函数的__name__已经从now变成了wrapper
  34. print(now.__name__) #可以看到now这个名字已经被改成了wrapper
  35.  
  36. #为了防止依赖于签名的那些函数执行时出错,要把原来函数的__name__复制到wrapper中
  37. import functools
  38. def log(func):
  39. @functools.wraps(func)
  40. def wrapper(*args, **kw):
  41. print('call %s():' % func.__name__)
  42. return func(*args, **kw) #注意这里返回的只是一个函数名,并没有传入参数
  43. return wrapper
  44.  
  45. @log #注意这里的也应该是一个函数名,如果看到传入某个参数的函数,那这个函数的返回值是一个函数
  46. def ff():
  47. print('fun is running……')
  48. ff() #只有编写函数之前加上@log,调用这个函数的时候才会直接调用log(ff())
  49.  
  50. import functools
  51. #针对带参数的decorator
  52. def log(text):
  53. def decorator(func):
  54. @functools.wraps(func)
  55. def wrapper(*args, **kw):
  56. print('%s %s():' % (text, func.__name__)) #这里的格式,牢记牢记牢记,别出错了
  57. return func(*args, **kw)
  58. return wrapper
  59. @log('rain:')
  60. def func():
  61. print('i love rain')

python中decorator的更多相关文章

  1. python中decorator的用法及原理(一)

    0. 概念 什么叫装饰器,其实也可以叫做包装器.即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来. Python中的装饰器分为两类:函数装饰器和类 ...

  2. python 中的decorator

    python 中decorator的作用就是一个包装的作用,所谓包装指在执行真正的函数之前或者之后,我们可以有一些额外的发挥余地. decorator形式如下 def dec(arg1): print ...

  3. 浅析python中的装饰器decorator

    最近学习python,其中decorator比较难理解,遂写一篇来总结供后续查阅. 定义一个函数,想在运行时动态的改变函数的功能,又不想改变函数本身的代码,可以使用高阶函数(可以使用函数作为参数) 装 ...

  4. decorator在Python中的作用

    decorator(装饰器)在python中作用,可以起到代码复用,也可以起到AOP(面向横切面)的作用. 另外很重要的一点应该就是function在python的世界中是作为一等公民存在的. 在py ...

  5. python中的decorator的作用

    1.概念 装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码.可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数. ...

  6. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...

  7. [转] Python中的装饰器(decorator)

    想理解Python的decorator首先要知道在Python中函数也是一个对象,所以你可以 将函数复制给变量 将函数当做参数 返回一个函数 函数在Python中和变量的用法一样也是一等公民,也就是高 ...

  8. python中编写无参数decorator

    Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数. 使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = de ...

  9. python2.7高级编程 笔记二(Python中的描述符)

    Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...

随机推荐

  1. VirtualBox 更改主机和虚拟机之间的鼠标切换热键

    VirtualBox 主机和虚拟机之间的鼠标切换热键 是 Right Ctrl.一般用惯VM Ware的都不太习惯,那么怎么改变VirtualBox鼠标切换热键呢? 1.点击菜单栏的   管理--&g ...

  2. Qgis插件开发之Qgis源码学习

    Qgis源码中的拖拽.zoomin/out等各个基础功能插件的实现位于qgis_app工程中. 具体头文件为: \QGIS\src\app\qgisapp.h 根据此类可以逐个找到Qgis的基础插件的 ...

  3. windows理论基础(一)

     windows体系结构 一. 用户模式和内核模式 (user mode &kernel mode) Intel x86 处理器的体系结构定义了四种特权级,或特为四个环.来保护系统代码不会被低 ...

  4. 《转》使用JAVA如何对图片进行格式检查以及安全检查处理

    本文出自冯立彬的博客,原地址:http://www.fenglibin.com/use_java_to_check_images_type_and_security.html 一.通常情况下,验证一个 ...

  5. label 和 legend标签的用法

    label 和 legend标签的用法 label标准用法: 一般浏览器都支持 一般而言,label标签位于表单元素的前面或者后面,为控件提供说明文字 <label for="user ...

  6. mysql数据库字段区分大小写的设置方法

    alter table t_25_thread_info modify column thread_id varchar(8) character set utf8 collate utf8_bin;

  7. Oracle的TPCC测试,原来也是个作弊的东西...

    http://www.oaktable.net/content/sorted-hash-clusters-rip 根据Jonathan Lewis老先生的测试实例,发觉cluster 的sort功能, ...

  8. 在两个Android设备间通过UDP传输目录内文件

    这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步.有问题请指教. 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认. 程序跑起来后,看网络状况,有时候会一 ...

  9. WCF 双工通信

    注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...

  10. 支持iOS9 Universal links遇到的问题

    记录为iOS9上的APP支持Universal links遇到的一些问题. 在Web服务器上传apple-app-site-association文件 必须支持HTTPS获取配置文件 文件名后不加.j ...