python函数装饰器的实现_Python函数装饰器实现方法详解

本文实例讲述了Python函数装饰器实现方法。分享给大家供大家参考,具体如下:

编写函数装饰器

这里主要介绍编写函数装饰器的相关内容。

跟踪调用

如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息。

class tracer:

def __init__(self,func):

self.calls = 0

self.func = func

def __call__(self,*args):

self.calls += 1

print('call %s to %s' %(self.calls, self.func.__name__))

self.func(*args)

@tracer

def spam(a, b, c):

print(a + b + c)

这是一个通过类装饰的语法写成的装饰器,测试如下:

>>> spam(1,2,3)

call 1 to spam

6

>>> spam('a','b','c')

call 2 to spam

abc

>>> spam.calls

2

>>> spam

运行的时候,tracer类和装饰的函数分开保存,并且拦截对装饰的函数的随后的调用,以便添加一个逻辑层来统计和打印每次调用。

装饰之后,spam实际上是tracer类的一个实例。

@装饰器语法避免了直接地意外调用最初的函数。考虑如下所示的非装饰器的对等代码:

calls = 0

def tracer(func,*args):

global calls

calls += 1

print('call %s to %s'%(calls,func.__name__))

func(*args)

def spam(a,b,c):

print(a+b+c)

测试如下:

>>> spam(1,2,3)

6

>>> tracer(spam,1,2,3)

call 1 to spam

6

这一替代方法可以用在任何函数上,且不需要特殊的@语法,但是和装饰器版本不同,它在代码中调用函数的每个地方都需要额外的语法。尽管装饰器不是必需的,但是它们通常是最为方便的。

扩展——支持关键字参数

下述代码时前面例子的扩展版本,添加了对关键字参数的支持:

class tracer:

def __init__(self,func):

self.calls = 0

self.func = func

def __call__(self,*args,**kargs):

self.calls += 1

print('call %s to %s' %(self.calls, self.func.__name__))

self.func(*args,**kargs)

@tracer

def spam(a, b, c):

print(a + b + c)

@tracer

def egg(x,y):

print(x**y)

测试如下:

>>> spam(1,2,3)

call 1 to spam

6

>>> spam(a=4,b=5,c=6)

call 2 to spam

15

>>> egg(2,16)

call 1 to egg

65536

>>> egg(4,y=4)

call 2 to egg

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值