MST

星途 面试题库

面试题:Python中装饰器的基本应用

请编写一个简单的Python装饰器,用于打印被装饰函数的执行时间。要求给出完整的代码实现,并解释装饰器的工作原理。
44.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import time


def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 执行时间: {end_time - start_time} 秒")
        return result

    return wrapper


@timer
def test_function():
    time.sleep(2)
    print("函数执行中...")


test_function()

装饰器工作原理解释

  1. 定义装饰器函数timer 是一个装饰器函数,它接受一个函数 func 作为参数。
  2. 定义内部包装函数:在 timer 函数内部定义了 wrapper 函数。这个函数接受任意位置参数 *args 和关键字参数 **kwargs,这使得它可以适配任何参数形式的被装饰函数。
  3. 记录开始时间:在调用被装饰函数 func 之前,使用 time.time() 记录当前时间,作为函数执行的开始时间 start_time
  4. 调用被装饰函数:执行 func(*args, **kwargs) 调用被装饰的函数,并将结果保存到 result 中。
  5. 记录结束时间:在被装饰函数执行完毕后,再次使用 time.time() 记录时间,作为函数执行的结束时间 end_time
  6. 打印执行时间:计算并打印被装饰函数的执行时间 end_time - start_time
  7. 返回结果:返回被装饰函数的执行结果 result,这样被装饰函数的原有功能不会受到影响。
  8. 应用装饰器:使用 @timer 语法糖将 timer 装饰器应用到 test_function 函数上,这等价于 test_function = timer(test_function)。当调用 test_function 时,实际上调用的是 wrapper 函数,从而实现了在执行函数前后记录时间并打印的功能。