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

Python装饰器的简单应用指南

发布时间:2023-12-11 02:58:28

Python装饰器是一种函数,它可以接受一个函数作为参数,并返回一个新的函数。装饰器可以在不修改被装饰函数的情况下,增加功能或修改行为。在本文中,我将向你介绍如何使用装饰器,并提供一些具体的使用例子。

1. 装饰器的基本语法

装饰器的基本语法如下:

def decorator(func):
    def wrapper(*args, **kwargs):
        # 在调用被装饰函数之前执行的代码
        result = func(*args, **kwargs)
        # 在调用被装饰函数之后执行的代码
        return result
    return wrapper

在这个例子中,decorator是一个装饰器函数,它接受一个函数func作为参数,并返回一个新的函数wrapper。新的函数wrapper在调用func之前和之后可以执行一些额外的代码。*args**kwargs是用来接收任意数量的位置参数和关键字参数。

2. 使用装饰器增加功能

装饰器可以用于增加函数的功能,例如打印函数执行时间、验证函数参数等。下面是一个使用装饰器打印函数执行时间的例子:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"函数 {func.__name__} 执行时间: {end - start}秒")
        return result
    return wrapper

@timer
def my_function():
    time.sleep(2)

my_function()

在这个例子中,timer是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。新的函数在调用被装饰函数之前记录开始时间,在调用之后记录结束时间,并打印执行时间。@timer语法将装饰器应用于函数my_function

3. 使用装饰器修改行为

装饰器也可以用于修改函数的行为,例如修改函数的返回值、缓存计算结果等。下面是一个使用装饰器修改函数返回值的例子:

def doubler(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result * 2
    return wrapper

@doubler
def my_function(x):
    return x + 1

print(my_function(2))  # 输出: 6

在这个例子中,doubler是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。新的函数在调用被装饰函数之后将返回值乘以2。@doubler语法将装饰器应用于函数my_function

4. 多个装饰器的应用顺序

当一个函数应用多个装饰器时,装饰器的应用顺序是从上到下的。例如:

def decorator1(func):
    def wrapper(*args, **kwargs):
        # 在调用被装饰函数之前执行的代码
        result = func(*args, **kwargs)
        # 在调用被装饰函数之后执行的代码
        return result
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        # 在调用被装饰函数之前执行的代码
        result = func(*args, **kwargs)
        # 在调用被装饰函数之后执行的代码
        return result
    return wrapper

@decorator1
@decorator2
def my_function():
    pass

在这个例子中,my_function被装饰器decorator1decorator2依次装饰。当调用my_function时,会按照以下顺序执行代码:decorator1wrapper函数中的代码 -> decorator2wrapper函数中的代码 -> my_function函数中的代码。

5. 带参数的装饰器

装饰器也可以接受参数,例如用来指定装饰器的行为或配置。下面是一个带参数的装饰器的例子:

def logger(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"[{level}] {func.__name__} 被调用了")
            result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@logger(level="INFO")
def my_function():
    pass

my_function()

在这个例子中,logger是一个接受参数level的装饰器工厂函数,它返回一个装饰器函数decorator。新的函数wrapper在调用被装饰函数之前打印一个日志。@logger(level="INFO")语法将装饰器应用于函数my_function,并传递了参数level

通过以上例子,你应该对Python装饰器有了一个基本的了解。装饰器可以在不修改函数代码的情况下,增加功能或修改函数的行为。使用装饰器可以提高代码的复用性和可维护性,使得代码更加简洁和灵活。