MST

星途 面试题库

面试题:Python装饰器:基础应用

请编写一个简单的Python装饰器,用于记录被装饰函数的执行时间,并在函数执行前后打印日志信息。要求给出完整代码,解释装饰器的工作原理。
33.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import time


def log_execution_time(func):
    def wrapper(*args, **kwargs):
        print(f"开始执行函数 {func.__name__}")
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 执行完毕,耗时 {end_time - start_time} 秒")
        return result

    return wrapper


@log_execution_time
def test_function():
    time.sleep(2)
    print("这是被装饰的函数")


if __name__ == "__main__":
    test_function()

装饰器工作原理解释:

  1. 定义装饰器函数log_execution_time 是一个装饰器函数,它接受一个函数 func 作为参数。
  2. 定义内部包装函数:在 log_execution_time 内部定义了 wrapper 函数,这个函数接受任意位置参数 *args 和关键字参数 **kwargs。这样 wrapper 函数可以接受与被装饰函数相同的参数。
  3. 日志打印与时间记录
    • 在调用被装饰函数 func 之前,打印开始执行的日志信息。
    • 使用 time.time() 获取当前时间作为函数执行开始时间 start_time
    • 调用被装饰函数 func,并将其返回值保存到 result 中。
    • 再次使用 time.time() 获取当前时间作为函数执行结束时间 end_time,计算并打印函数执行耗时。
  4. 返回包装函数log_execution_time 函数最后返回 wrapper 函数。这样,当使用 @log_execution_time 装饰其他函数时,实际上是将被装饰函数替换为 wrapper 函数,从而在执行被装饰函数的前后添加了日志记录和时间计算的功能。