欢迎访问宙启技术站
智能推送

Python中的装饰器简介

发布时间:2024-01-20 01:03:55

Python中的装饰器是一种特殊的函数,它用于修改其他函数的功能。装饰器函数接受被装饰函数作为参数,并返回一个新的函数,新函数与原函数具有相同的名称,但是在原函数的功能上增加了一些附加的操作。这样,我们可以在不修改被装饰函数的前提下,对其功能进行扩展或修改。

装饰器函数使用@语法来修饰其他函数。下面是一个简单的示例,其中定义了一个装饰器函数logger,用于打印函数的执行时间:

import time

def logger(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

@logger
def my_function():
    time.sleep(1)
    print("这是被装饰的函数")

my_function()

在上述代码中,装饰器函数logger接受一个函数func作为参数,并定义了一个内部函数wrapper,该函数在调用原函数之前先记录下当前时间,然后执行原函数,最后再记录下结束时间,并计算出函数的执行时间。最后,装饰器函数返回内部函数wrapper

通过在被装饰函数的定义前加上@logger,可以让my_function函数被logger修饰,即my_function函数与原函数具有相同的名称和参数,但是在执行过程中会额外添加打印时间的功能。

运行上述代码,输出结果为:

这是被装饰的函数
函数 my_function 的执行时间为 1.0002031326293945 秒

可以看到,my_function函数被装饰器修饰后,在执行结束后会打印出函数的执行时间。

装饰器可以为函数添加任意的附加功能。除了打印时间之外,可以使用装饰器实现缓存、权限验证、输入验证、日志记录等功能。

下面是一个使用装饰器实现缓存的例子,其中定义了一个装饰器函数cache

def cache(func):
    cached_results = {}

    def wrapper(*args):
        if args in cached_results:
            return cached_results[args]
        result = func(*args)
        cached_results[args] = result
        return result

    return wrapper

@cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(10))

在上述代码中,装饰器函数cache用于缓存函数的计算结果。内部定义了一个字典cached_results用于保存已计算过的结果。在调用被装饰函数之前,装饰器会先检查缓存中是否已存在相应的结果。如果存在,则直接返回;如果不存在,则执行原函数,并将计算结果保存到缓存中。

通过在fibonacci函数的定义前加上@cache,可以使得fibonacci函数在递归调用时可以利用已经缓存的结果,从而提高效率。

运行上述代码,输出结果为:

55

可以看到,计算斐波那契数列第10个数的过程中,由于使用了缓存装饰器,计算结果被缓存在字典cached_results中,避免了重复计算,提高了效率。

总结来说,装饰器是一种用于扩展或修改函数功能的特殊函数。它接受一个函数作为参数,并返回一个新的函数,新函数在原函数的基础上增加了一些附加的操作。装饰器使用@语法来修饰其他函数,使其在调用时自动应用装饰器提供的功能。使用装饰器可以方便地实现缓存、权限验证、输入验证、日志记录等功能。在实际开发中,装饰器是一种非常有用且灵活的工具,可以帮助我们简化代码,提高程序的可重用性和可维护性。