码迷,mamicode.com
首页 > 编程语言 > 详细

python装饰器同时支持有参数和无参数的练习题

时间:2019-04-12 19:13:03      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:rap   中间   获得   too   失败   function   exec   nbsp   遍历   

‘‘‘

预备知识:

……

@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(‘测试失败!‘)

python装饰器同时支持有参数和无参数的练习题

标签:rap   中间   获得   too   失败   function   exec   nbsp   遍历   

原文地址:https://www.cnblogs.com/sqs-cn/p/10697803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!