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

在Python函数中使用装饰器-实用装饰器与函数修饰。

发布时间:2023-10-17 06:54:44

在Python中,装饰器是一种特殊的函数,它可以用于修改其他函数的功能。装饰器在Python中的应用十分广泛,可以用于日志记录、缓存、身份验证等各种场景。

使用装饰器可以将一个函数作为参数传递给另一个函数,并返回一个新的函数,新函数可以在调用原函数前后执行一些额外的操作。这样可以在不修改原函数代码的情况下,给函数添加新的功能。

下面是一个简单的例子,展示了如何使用装饰器修改函数的功能:

def decorator(func):
    def wrapper():
        print("装饰器开始执行")
        func()
        print("装饰器执行完毕")
    return wrapper

@decorator
def hello():
    print("Hello, Python!")

hello()

在上面的代码中,我们定义了一个装饰器函数decorator,它接受一个函数作为参数,并返回一个新的函数wrapper。然后我们使用@decorator语法将hello函数修饰成一个新的函数。

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

装饰器开始执行
Hello, Python!
装饰器执行完毕

从输出结果可以看出,装饰器在调用hello函数前后分别输出了装饰器开始执行装饰器执行完毕的信息。

除了上面的示例外,实际使用中装饰器还有很多实用的应用场景。下面我们将介绍一些常用的实用装饰器和函数修饰技巧。

1. 记录日志

import logging

def log_decorator(func):
    def wrapper(*args, **kwargs):
        logging.info(f"函数 {func.__name__} 被调用")
        return func(*args, **kwargs)
    return wrapper

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

result = add(1, 2)

上面的代码使用装饰器log_decorator实现了一个日志记录功能。每次调用被装饰的函数时,都会在日志中记录函数被调用的信息。

2. 缓存结果

def cache_decorator(func):
    cache = {}

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

    return wrapper

@cache_decorator
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

result = fib(10)

上面的代码使用装饰器cache_decorator实现了一个缓存结果的功能,对于斐波那契数列的计算,如果之前已经计算过某个数的结果,则直接返回缓存中的结果,避免重复计算。

3. 身份验证

def auth_decorator(func):
    def wrapper(*args):
        if check_auth():
            return func(*args)
        else:
            raise Exception("身份验证失败")
    return wrapper

@auth_decorator
def create_order(user_id):
    # 创建订单逻辑
    pass

create_order(123)

上面的代码使用装饰器auth_decorator实现了一个身份验证功能,每次调用create_order函数时,都会先验证用户的身份,如果验证通过则继续执行函数,否则抛出异常。

除了上面提到的实用装饰器之外,还有很多其他的装饰器可以用于修改函数的功能,例如:

- 计时器:用于统计函数的执行时间。

- 重试:当函数执行失败时,自动重试指定次数。

- 参数校验:在函数调用前检查参数的合法性。

- 权限验证:检查用户是否有执行函数的权限。

总之,装饰器是Python中非常有用的一种语法特性,可以用于扩展函数的功能。通过使用装饰器,可以在不修改函数代码的情况下,给函数添加日志记录、缓存、身份验证等各种功能。这使得代码更加简洁、可复用,提高了代码的可维护性和可拓展性。