@decorator可以动态实现函数功能的增加,但是,经过@decorator“改造”后的函数,和原函数相比,除了功能多一点外,有没有其它不同的地方?

在没有decorator的情况下,打印函数名:

def f1(x):pass
print f1.__name__

输出:

 f1

有decorator的情况下,再打印函数名:

def log(f):def wrapper(*args, **kw):print 'call...'return f(*args, **kw)return wrapper
@log
def f2(x):pass
print f2.__name__

输出:

wrapper

可见,由于decorator返回的新函数函数名已经不是'f2',而是@log内部定义的'wrapper'。这对于那些依赖函数名的代码就会失效。decorator还改变了函数的__doc__等其它属性。如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中:

def log(f):def wrapper(*args, **kw):print 'call...'return f(*args, **kw)wrapper.__name__ = f.__name__wrapper.__doc__ = f.__doc__return wrapper

这样写decorator很不方便,因为我们也很难把原函数的所有必要属性都一个一个复制到新函数上,所以Python内置的functools可以用来自动化完成这个“复制”的任务:

import functools
def log(f):@functools.wraps(f)def wrapper(*args, **kw):print 'call...'return f(*args, **kw)return wrapper

最后需要指出,由于我们把原函数签名改成了(*args, **kw),因此,无法获得原函数的原始参数信息。即便我们采用固定参数来装饰只有一个参数的函数:

def log(f):@functools.wraps(f)def wrapper(x):print 'call...'return f(x)return wrapper

也可能改变原函数的参数名,因为新函数的参数名始终是 'x',原函数定义的参数名不一定叫 'x'。

转载于:https://www.cnblogs.com/Lambda721/p/6129054.html

python中完善decorator相关推荐

  1. Python中的decorator装饰器使用方法

    装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...

  2. python decorator模块_在Python中实现decorator模式

    作为Philipp答案的补充:如果您不仅需要修饰,而且需要保留对象的类型,Python允许您在运行时为实例子类化:class foo(object): def f1(self): print &quo ...

  3. python中title函数有什么用_Python中title()方法的使用简介

    Python中title()方法的使用简介 title()方法返回所有单词的第一个字符大写的字符串的一个副本. 语法 以下是title()方法的语法: str.title(); 参数 NA 返回值 此 ...

  4. Python 中的闭包、匿名函数、decorator 装饰器与python的偏函数

    Python中的闭包 def calc_sum(lst):def lazy_sum():return sum(lst)return lazy_sum 像这种内层函数引用了外层函数的变量(参数也算变量) ...

  5. 对于python中的self,cls,decorator的理解

    1. self, cls 不是关键字 在python里面,self, cls 不是关键字,完全可以使用自己写的任意变量代替实现一样的效果 代码1 Python代码 Code: class MyTest ...

  6. python中的装饰器decorator

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

  7. python decorator_python 中的decorator

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

  8. python 中decorator和property

    1.装饰器decorator 实质是一个迭代器,把定义的函数作为一个属性来调用.具体来看: def hello(fn):print(1)def wrapper():print(2)print(&quo ...

  9. python decorator. decorator_decorator在Python中的作用

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

最新文章

  1. 安卓开发重磅炸弹!程序员福利!《高级Kotlin强化实战学习手册(附Demo)》开放下载!
  2. 中国金控(00875.HK)获主席兼首席执行官林裕豪增持15.8万股
  3. java buffer nio_Java NIO之Buffer(缓冲区)入门
  4. VMWare安装DOS系统实现文件共享
  5. webform 简单的服务器控件。
  6. OSX 挂载 NTFS 格式硬盘
  7. Java JDBC中,MySQL字段类型到JAVA类型的转换
  8. 了解Linux操作系统发展阶段
  9. Java并发编程实战~Guarded Suspension模式
  10. mysql锁表语句,Java核心知识点
  11. 星星评价控件android开发_Android自定义View,评分星星控件(RatingBar)
  12. css grid随页面大小_前端三大布局,float,flex,grid的介绍。
  13. spss 为何打不开
  14. 设计模式——Facade(外观)模式
  15. ffmpeg安装教程(windows版)
  16. WINDOWS 系统自定义编程 键盘
  17. 解决页面favicon.ico文件不存在提示404问题
  18. 梅赛德斯-奔驰获得世界上第一个有条件自动驾驶的国际有效系统批准
  19. js将字符串转换为数字
  20. 【VBA】在word中写多级列表

热门文章

  1. Python处理XML文件
  2. php ziparchive 压缩文件,php使用ZipArchive压缩打包文件
  3. plasma桌面设置好的面板消失了_Ubuntu Studio 将用 KDE Plasma 桌面环境替换 Xfce | Linux 中国...
  4. basler相机参数简要中文说明_附下载| OpenCV最新中文版官方教程
  5. python语音合成 标贝_tacotronV2 + wavernn 实现中文语音合成(Tensorflow + pytorch)
  6. java servlet applet,详解Java Servlet与Applet比较
  7. c语言 静态链表插入排序,数据结构C语言版 表插入排序
  8. Java案例——字符串拼接
  9. CSS超出隐藏并且能滚动
  10. js把for循环出来的数据存入数组