前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python进阶|装饰器的那些事(二)

Python进阶|装饰器的那些事(二)

作者头像
罗罗攀
发布2019-11-04 13:48:03
2540
发布2019-11-04 13:48:03
举报
前言

上次我们讲解了装饰器的定义和使用,这节课我们再继续深入聊聊装饰器的那些事。

装饰器的嵌套

装饰器是可以嵌套的,当然我们关心的是嵌套的装饰器的执行顺序,例如下面这个案例:

代码语言:txt
复制
@decorator1
@decorator2
@decorator3
def func():
    pass

逆向传参,正向执行,所以是这样的:

代码语言:txt
复制
decorator1(decorator2(decorator3(func)))

我们还是简单举个例子,加深我们的理解。

代码语言:txt
复制
def decorator1(func):
    def wrapper(*args,**kwargs):
        print('first start')
        func(*args,**kwargs)
        print('first end')
    return wrapper

def decorator2(func):
    def wrapper(*args,**kwargs):
        print('second start')
        func(*args,**kwargs)
        print('second end')
    return wrapper

@decorator1
@decorator2
def func(message):
    print(message)

func('hello world')

# first start
# second start
# hello world
# second end
# first end
类装饰器

之前我们的案例都是用函数作为装饰器,类也是可以做为装饰器的,这个主要是需要用到__call__。

每当类实例一次,__call__方法就调用一次。

代码语言:txt
复制
class Decorate():
    def __init__(self,func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print('start')
        return self.func(*args, **kwargs)

@Decorate
def func(message):
    print(message)

func('hello world')
# start
# hello world
案例

我们经常会去测试一些函数的执行时间,以便进行调试,这时我们就可以使用装饰器来实现这样的功能。

用以下代码,当想测试其他函数时,只需要在前面加上@log_time即可。

代码语言:txt
复制
import time
def log_time(func):
    def wrapper(*args,**kwargs):
        t1 = time.time()
        func(*args,**kwargs)
        t2 = time.time()
        print('{}'.format(t1-t2))

    return wrapper

@log_time
def func(*args,**kwargs):
    ...
总结

本次我们讲解了嵌套装饰器以及类装饰器的使用,最后用一个简单的案例,加深你对于装饰器的理解。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 装饰器的嵌套
  • 类装饰器
  • 案例
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档