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

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

需求一:
函数

那我如今有个需求,原函数是这样的内存

def test1():ci

    a = "test1"
it

    time.sleep(3)class

    return  atest

能够看到是有返回值的,可咱们以前的装饰器,并无处理原函数的返回值的逻辑,那么我如今怎么办,看代码im


def record_time(func):装饰器

    def warpper():dict

        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. 返回各自的结果

相关文章
相关标签/搜索