python 装饰器从放弃到玩转(中级)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 装饰器从放弃到玩转(中级)相关的知识,希望对你有一定的参考价值。

前面我们说到装饰器的初步使用

需求一:

那我现在有个需求,原函数是这样的

def test1():

    a = "test1"

    time.sleep(3)

    return  a

可以看到是有返回值的,可我们之前的装饰器,并没有处理原函数的返回值的逻辑,那么我现在怎么办,看代码


def record_time(func):

    def warpper():

        start_time = time.time()

        a = func()

        end_time = time.time()

        print "总共用时:" + str(int(end_time) - int(start_time))

        return a

    return warpper


@record_time

def test1():

    a = "test1"

    time.sleep(3)

    return a


r = test1()

print r


步骤解释:

  1. @record_time== test1=record_time(test1)=warpper

  2. r = test1()

    test1() == warpper()

    里面直接return了原test1函数的返回值

  3. r = 原test1的返回值


需求一:

def test1(name):

    a = name

    time.sleep(3)

    return  a


def test2(name,age):

    a = name

    b = age

    dict = {}

    dict["name"] = a

    dict["age"] = age

    time.sleep(3)

    return  dict

我现在的函数需要传值,并且每个函数可能传的参数不是固定的,要求记录函数的执行时间


请看实现的代码如下

def record_time(func):

    def warpper(*args,**kwargs):

        start_time = time.time()

        a = func()

        end_time = time.time()

        return a

    return warpper 


@record_time

def test1(name):

    a = name

    time.sleep(3)

    return  a


@record_time

def test2(name=name ,age=age):

    a = name

    b = age

    dict = {}

    dict["name"] = a

    dict["age"] = age

    time.sleep(3)

    return  dict


r = test1("test01")

r1 = test2("test02",20)

print r,r1

解释:

  1. @record_time == test1 = record_time(test1) = warpper(前面忘讲了,这个就是warpper的内存地址)

  2. @record_time == test2 = record_time(test2) = warpper

  3. test1("test01")== warpper("test01"),而warpper函数可以允许你传入不固定参数*agrs(元祖)和关键字参数(**kwargs)

  4. warpper中执行了原来的test01和test02

  5. 返回各自的结果

本文出自 “expect批量同步数据” 博客,请务必保留此出处http://4249964.blog.51cto.com/4239964/1897532

以上是关于python 装饰器从放弃到玩转(中级)的主要内容,如果未能解决你的问题,请参考以下文章

python 生成器从放弃到玩转

python全栈开发从入门到放弃之装饰器函数

装饰器

python函数装饰器迭代器生成器

百度工程师教你玩转设计模式(装饰器模式)

装饰器模式(从放弃到入门)