python中完善decorator

@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‘。

时间: 2024-07-28 14:56:47

python中完善decorator的相关文章

python 中的decorator

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

python中的decorator的作用

1.概念 装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码.可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数.在python中,装饰器(decorator)分为函数装饰器和类装饰器两种.python中内置的@语言就是为了简化装饰器调用. 列出几个装饰器函数: 打印日志:@log 检测性能:@performance 数据库事务:@transaction URL路由:@post('/register') 2.使

初窥Python(五)——python中的decorator

1. 介绍 decorator是用来在代码运行期间动态增加功能的,本质上是一个返回函数的高阶函数.假设现在有这样一种需求,即在每个函数调用前记录日志,记录被调用的函数名称,可以这样实现: def log(func):     def wrapper(*args, **kwargs):         print "CALL %s()" % func.__name__         return func(*args, **kwargs)     return wrapper def 

python中的decorator模块

decorator模块是python用来专门封装装饰器的模块,使用decorator构造装饰器更加简便,同时被装饰的函数签名也保留不变 from decorator import decorator @decorator def check_num(func, *args, **kwargs): if len(args) != 2: raise Exception('Your args number is not two') else: return func(*args, **kwargs)

python中的函数式编程与装饰器

2.1 python中的函数式编程 函数式编码的特点 把计算视为函数而非指令 纯函数式编程,不需要变量,没有副作用,测试简单 支持高阶函数,代码简洁 python支持的函数式编程 不是纯函数式编码:允许有变量 支持高阶函数:函数也可以作为变量传入 支持闭包:有了闭包就能返回函数 有限度地支持匿名函数 2.2 python中高阶函数 函数名可以作为变量,如 高阶函数:只能接收函数作为参数的函数 变量可以是指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 能接收函数作为参数的函数

转载:唐磊的个人博客《python中decorator详解》【转注:深入浅出清晰明了】

转载请注明来源:唐磊的个人博客<python中decorator详解> 前面写python的AOP解决方案时提到了decorator,这篇文章就详细的来整理下python的装饰器--decorator. python中的函数即objects 一步一步来,先了解下python中的函数. def shout(word='hello,world'):     return word.capitalize() + '!'print shout()#输出:Hello,world!#跟其他对象一样,你同样

Python中的@property和decorator

初次认识decorator和@property Welcome. 在本文中,将详细学习如何使用Python中的decorator和@property. 将会学习的内容: 使用decorator的优势. 使用@property的优势. 装饰器函数的基础知识:它们是什么以及如何与@property关联起来. 如何使用@property定义getter.setter和deleter. Python中decorator的优势 在不确定其他代码块对现有函数的调用,不改变现有函数,保证代码可靠稳定,避免修改

对Python中装饰器(Decorator)的理解与进阶

有时候我们项目中的某些功能做些修改即需要对内部的某些函数添加一些附加功能,但是为了安全起见不想改变函数的源代码以及函数的调用方式,那么装饰器在这个地方会给我们带来很大的帮助. 装饰器(Decorator):(又叫语法糖) 定义:本质是函数,功能(装饰其它函数)就是为其他函数添加附加功能 原则:(1).不能修改被装饰的函数的源代码 (2).不能修改被装饰的函数的调用方式 1.先来实现一个简单的装饰器示例: #!/usr/bin/env python # -*- coding:utf-8 -*- #

python中decorator

先讲一下python中的@符号 看下面代码 @f @f2 def fun(args, args2, args3, args4, ……): pass 上面代码相当于 def fun(args, args2, args3, args4, ……): pass fun = fun(f2(fun))