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

Python装饰器的常见用途与实例分析

发布时间:2024-01-07 06:47:43

Python装饰器是一种在运行时动态增加函数功能的方法。它可以在不改变函数本身的代码的情况下,为函数或类添加额外的功能。

装饰器的常见用途如下:

1. 记录日志:装饰器可以用来记录函数的调用日志,可以记录函数的参数、返回值、执行时间等信息,方便在程序运行过程中进行调试和排查问题。

下面是一个记录函数执行日志的装饰器的使用例子:

def log(func):
    def wrapper(*args, **kwargs):
        print(f"Call {func.__name__} with args: {args}, kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@log
def add(a, b):
    return a + b

result = add(1, 2)

在上面的例子中,log装饰器会打印出add函数的调用日志,并在函数执行完后打印返回值。

2. 访问控制:装饰器可以用来限制函数的访问权限,只有满足特定条件的用户或角色才能调用被装饰的函数。

下面是一个访问控制的装饰器的使用例子:

def access_control(func):
    def wrapper(user, *args, **kwargs):
        if user == "admin":
            return func(user, *args, **kwargs)
        else:
            raise Exception("Access denied")
    return wrapper

@access_control
def delete_file(user, file_name):
    print(f"Deleting file {file_name} as {user}")

delete_file("admin", "test.txt")

在上面的例子中,access_control装饰器限制了只有user参数为"admin"的用户才能调用delete_file函数。

3. 时间测量:装饰器可以用来测量函数的执行时间,方便分析和优化程序的性能。

下面是一个测量函数执行时间的装饰器的使用例子:

import time

def measure_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time} seconds to run")
        return result
    return wrapper

@measure_time
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

result = fibonacci(10)

在上面的例子中,measure_time装饰器会测量fibonacci函数的执行时间,并打印出来。

4. 缓存结果:装饰器可以用来缓存函数的结果,以避免重复计算,提高程序的运行效率。

下面是一个缓存函数结果的装饰器的使用例子:

def cache_result(func):
    cache = {}
    def wrapper(*args, **kwargs):
        key = (args, tuple(sorted(kwargs.items())))
        if key not in cache:
            cache[key] = func(*args, **kwargs)
        return cache[key]
    return wrapper

@cache_result
def factorial(n):
    if n <= 1:
        return 1
    else:
        return n * factorial(n-1)

result = factorial(10)

在上面的例子中,cache_result装饰器会缓存factorial函数的结果,避免重复计算。

以上是Python装饰器的常见用途与相关实例的分析。装饰器是Python语言的一项强大特性,可以大大提高代码的复用性和可维护性。通过运用装饰器,我们可以轻松地为函数添加统一的功能,而无需修改函数的实现代码。