'''

预备知识:

……

@decorator

def f(*args,**kwargs):

    pass

# 此处@decorator  等价于 f = decorator(f)

 @decorator2(*args,**kwargs)

def f2(*args,**kwargs):

    pass

# 此处@decorator2(*args,**kwargs)  等价于: 第一步,执行函数decorator2(*args,**kwargs),获得中间结果temp;  第二步,执行装饰器函数(即@temp)

'''

 

import functools,time

def log(*args,**kwargs):

    def metric(fn):

        @functools.wraps(fn)

        def t(*args,**kwargs):  #计算函数执行消耗的时间

            t0 = time.time()

            result = fn(*args, **kwargs)

            t1 = time.time()

            print('%s executed in %s ms' % (fn.__name__, t1 - t0))

            return result

        return t

    for i in args:

        if type(i).__name__ == 'function':    #判断传入的参数是函数名称(即log后面没有带参数)

            return metric(i)   #返回并执行装饰器函数metric(),相当于log是metric的别名。

        else:  # log后面带普通参数的情形

            print(i)   # 理论上,log后面可传入无限个参数,如何使用应结合具体情形,本例仅遍历打印,且参数中不包含‘function’类型。

    return metric  # log后面带普通参数,说明log()是个普通函数,执行log()后,返回装饰器函数的名字metric,再执行metric().

 

 

# 测试

@log("execute")

def fast(x, y):

    time.sleep(0.0012)

    return x + y

 

@log

def slow(x, y, z):

    time.sleep(0.1234)

    return x * y * z

 

f = fast(11, 22)

s = slow(11, 22, 33)

if f != 33:

    print('测试失败!')

elif s != 7986:

    print('测试失败!')

posted on 2019-04-12 18:34  孙文  阅读(269)  评论(0编辑  收藏  举报