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

Python装饰器-为函数添加额外的功能

发布时间:2023-12-03 10:25:58

Python的装饰器是一种很有用的功能,可以为函数添加额外的功能,而不需要对函数本身进行修改。

装饰器本质上是一个函数,它接受目标函数作为参数,并返回一个新的函数。这个新的函数执行了目标函数,并在执行前后可以做一些额外的操作,比如打印日志、计时等。

使用装饰器的语法是在目标函数的定义上加上@符号,后面跟上装饰器函数的名字。例如:

@decorator
def target_function():
    ...

下面以一个简单的例子来说明装饰器的用法。

import time

# 定义一个装饰器函数,用来计时
def timer(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print(f"Function {func.__name__} took {end_time - start_time}s to run")
    return wrapper

# 定义一个目标函数
@timer
def my_function():
    time.sleep(1)
    print("Function is running")

# 调用目标函数
my_function()

运行上面的代码,会输出以下结果:

Function is running
Function my_function took 1.0002076625823975s to run

可以看到,装饰器函数timer在调用my_function之前先记录了开始时间,然后调用目标函数,最后再记录结束时间并打印出函数执行时间。

除了计时以外,装饰器还可以应用于很多其他的场景。比如,可以用装饰器来实现函数的缓存,这样可以避免重复计算;还可以用装饰器来实现权限验证,只有具有特定权限的用户才能调用目标函数;还可以用装饰器来实现日志记录,记录函数的输入参数和返回结果等等。

下面是一个示例,展示了如何使用装饰器来实现函数的缓存。

# 定义一个装饰器函数,实现函数的缓存
def cache(func):
    result_cache = {}
    def wrapper(*args):
        if args in result_cache:
            print("Get result from cache")
            return result_cache[args]
        else:
            result = func(*args)
            result_cache[args] = result
            return result
    return wrapper

# 定义一个目标函数,计算斐波那契数列
@cache
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 调用目标函数
print(fibonacci(10))
print(fibonacci(10))

运行上面的代码,会输出以下结果:

55
Get result from cache
55

可以看到,在第一次调用fibonacci(10)时,会进行正常的计算过程,并把结果缓存起来。然后,第二次调用fibonacci(10)时,会直接从缓存中取出结果,而不再进行重复的计算。

总结来说,装饰器是一种强大而灵活的工具,可以帮助我们在不改变函数本身的情况下,为函数添加额外的功能。通过使用装饰器,我们可以轻松地实现一系列的功能,比如计时、缓存、权限验证、日志记录等等,从而提高代码的复用性和可维护性。