一行代码,轻松编写装饰器

一行代码能轻松编写装饰器么,当然不能,但实际的工作量和一行代码真的没有太多区别,先看一个常规方法编写的装饰器

def cost(func):
    def warpper(*args, **kwargs):
        t1 = time.time()
        res = func(*args, **kwargs)
        t2 = time.time()
        print(func.__name__ + "执行耗时" +  str(t2-t1))
        return res
    return warpper

@cost
def test_cost(sleep):
    time.sleep(sleep)


test_cost(2)

很多人被装饰器的闭包概念搞的死去活来,不能理解一切皆对象的概念,别说写一个装饰器,就是看一个装饰器都不能理解其中之意。

得益于python强大的社区,有人写出了一个模块,可以让你轻松写出一个装饰器,该模块安装命令为 pip3 install decorator

使用起来,极为简单

import time
from decorator import decorator


@decorator
def cost(func, *args, **kw):
    t1 = time.time()
    res = func(*args, **kw)
    t2 = time.time()

    print(func.__name__ + "执行耗时", t2-t1)
    return res

@cost
def test_cost(sleep):
    time.sleep(sleep)


test_cost(2)

cost函数被decorator装饰,cost就变成了一个装饰器,第一个参数必须传入函数,就是你希望被cost装饰的函数,*args 和 **kw 是用来传给func的参数,如果你想写一个带参数的装饰器,同样很简单

import time
from decorator import decorator


@decorator
def cost(func, timelimit=3, *args, **kw):
    t1 = time.time()
    res = func(*args, **kw)
    t2 = time.time()
    # 只打印运行时长超过timelimit的函数
    if (t2-t1) > timelimit:
        print(func.__name__ + "执行耗时", t2-t1)
    return res

@cost
def test_cost(sleep):
    time.sleep(sleep)


test_cost(3)

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案