您的位置:首页 > 其它

一个有参装饰器,它可作用于任何函数上

2021-03-15 22:16 169 查看

最近Python网络班学员去一个公司面试,遇到了一个很有意思的问题:

请设计一个有参装饰器decorator,它可作用于任何函数上,要求可以接受一个int作为参数,该参数为要求的执行秒数,如果该函数的执行时间大于规定的执行秒数,请打印改函数名字和执行时间。

马哥教育Python网络班企业教练思路:

#我们先来分析下:1、有参数的装饰器 --> 可以使用高阶函数实现2、执行时间 --> 可以使用python的time 库

实现代码:

from functools import wraps
import time


class TakeTime:
   def __init__(self, para: int):
       self.para = para

   def __call__(self, func):
       @wraps(func)
       def wrapped(*args, **kwargs):
           start_time = time.time()
           name = func.__name__
           func(*args, **kwargs)
           count_time = time.time() - start_time
           if self.para >= count_time:
               print("the {name} take {time}, less time".format(name=name, time=count_time))
           else:
               print("the {name} take {time}, more time".format(name=name, time=count_time))
           return func
       return wrapped


def func_time(para: int):
def decorator(func):
       @wraps(func)
       def wrapper(*args, **kwargs):
           start_time = time.time()
           name = func.__name__
           func(*args, **kwargs)
           count_time = time.time() - start_time
           if para >= count_time:
               print("the {name} take {time}, less time".format(name=name, time=count_time))
           else:
               print("the {name} take {time}, more time".format(name=name, time=count_time))
           return func
       return wrapper
   return decorator

@TakeTime(10)
def log():
   for x in range(10):
       time.sleep(0.5)


@func_time(10)
def log1():
   for x in range(10):
       time.sleep(0.5)
代码执行结果:
the log take 5.030340194702148, less time<function log at 0x10216d950>


☆ END ☆

以上案例来自马哥Python网络班企业教练和学员的日常交流,学员学习Python过程中遇到问题不知道如何解决,遇到问题没有思路,都可以跟企业教练一对一交流,快来马哥教育了解一下Python课程吧。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐