最近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课程吧。