python函数装饰函数_Python函数装饰器

本文来介绍一下Python的函数装饰器,类装饰器以后另开一文讲。

装饰器可以看做是Python中的一个语法糖,基本的写法示例如下:

defdecorator(func):returnfunc

@decoratordeffunction():print "666"

decorator即是function的装饰器,在function函数前面加上@decorator的前缀相当于:

function = decorator(function)

所以之后对function的调用实际上都是在调用decorator。

以上只是最最简单的写法,一般装饰器会在函数内部定义一些自己的操作,相当于“装饰”了原本的函数。例如:

importtimedefdecorator(func):def clocked(*args):

t0=time.time()

result= func(*args)

elapsed= time.time() -t0

name= func.__name__

printelapsed, name, resultreturnresultreturnclocked

@decoratordeffunction():print "666"function()print function

输出如下:

666

0.0function None

可以看到:

1.该装饰器的作用是输出所装饰函数的运行时间,和函数名以及返回值

2.通过输出function,可以发现此时它已经被替换成了clocked,这与前面讲的“function = decorator(function)”是吻合的。

另外关于装饰器要注意的一点是:装饰器是在加载该模块的时候执行的。举个例子,假设有如下代码:

defdecorator(func):print "7777"

returnfunc

@decoratordeffunction():print "666"

if __name__ == '__main__':print "start!"function()

运行该py文件后输出如下:

7777start!666

可以看到,“777”出现在“start!”之前,这说明装饰器是在实际运行该模块之前输出的。

装饰器是可以累加的,

defdecorator1(func):print "666"

returnfuncdefdecorator2(func):print "777"

returnfunc

@decorator2

@decorator1deffunction():print "88"

等同于

function = decorator2(decorator1(function))

如果我们想给装饰器传入参数,该如何做呢?这就需要我们创建一个装饰器工厂函数,把参数传给它,返回一个装饰器,然后再把它应用到要装饰的函数上。具体示例如下:

importtimedef decorator(is_active=True):defdec1(func):ifis_active:print "888"

else:print "777"

returnfuncreturndec1

@decorator(True)deffunction():print "666"

dec1才是真正的装饰器(它的参数是func),decorator可以理解为一个装饰器工厂,它返回相应的装饰器函数。

这次装饰器就讲解到这里,之后有时间会再讲解一下类装饰器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值