📜  Python装饰器(1)

📅  最后修改于: 2023-12-03 15:04:41.867000             🧑  作者: Mango

Python装饰器

Python装饰器是一种强大的语法特性,它可以在不改变原始函数代码的情况下,通过在函数定义之前使用特殊的语法进行扩展和修改函数的行为。

为什么使用装饰器

装饰器提供了一种简洁而优雅的方式来修改函数或类的行为。它们可以用于很多场景,例如:

  • 添加额外的功能或逻辑,如日志记录、性能分析、缓存等。
  • 对函数进行验证和授权,以确保只有特定的用户可以访问。
  • 修改函数的输入或输出,使其符合特定的格式或要求。

使用装饰器的好处包括:

  • 避免了修改原始函数代码,使得代码更加清晰和可维护。
  • 可以在不影响原始函数的情况下,多次使用同一个装饰器来扩展不同的函数。
  • 装饰器可以灵活地组合和嵌套使用,以满足复杂的需求。
装饰器的用法

装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。装饰器的使用方式是在要扩展或修改的函数定义之前,通过在函数名前面加上装饰器来使用。

下面是一个简单的例子,演示如何使用装饰器来记录函数的执行时间:

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("函数 {} 的执行时间为 {} 秒".format(func.__name__, end_time - start_time))
        return result
    return wrapper

@timer_decorator
def my_function():
    # 函数逻辑代码
    pass

my_function()

在上面的例子中,timer_decorator 是一个装饰器函数,它接受一个函数作为参数,并定义了一个内部函数 wrapperwrapper 函数在调用原始函数之前和之后执行了额外的逻辑,用于计算函数的执行时间。

通过 @timer_decorator 将装饰器应用到 my_function 上,实际上相当于执行了 my_function = timer_decorator(my_function) 这一行代码。这样,在调用 my_function 时,实际上执行的是 wrapper 函数,从而实现了记录函数执行时间的功能。

装饰器的高级用法

除了上述基本用法外,装饰器还有一些高级应用。

带参数的装饰器

装饰器可以接受参数,这样可以在使用装饰器时传入一些配置或选项。

def parametrized_decorator(param1, param2):
    def decorator(func):
        def wrapper(*args, **kwargs):
            # 使用参数 param1 和 param2
            print("装饰器参数:", param1, param2)
            return func(*args, **kwargs)
        return wrapper
    return decorator

@parametrized_decorator("参数1", "参数2")
def my_function():
    # 函数逻辑代码
    pass

my_function()

在上面的例子中,parametrized_decorator 是一个带参数的装饰器,它返回一个装饰器函数 decoratordecorator 函数再返回真正用来包装函数的 wrapper 函数。通过给 parametrized_decorator 传递参数,可以在装饰器内部使用这些参数。

类装饰器

除了函数装饰器,Python 还支持类装饰器。类装饰器是指实现了 __call__ 方法的类,它可以像函数装饰器一样使用。

class Decorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        # 装饰器逻辑
        print("装饰器执行")
        return self.func(*args, **kwargs)

@Decorator
def my_function():
    # 函数逻辑代码
    pass

my_function()

在上面的例子中,Decorator 是一个类装饰器,它的 __init__ 方法接受一个函数作为参数,并将其保存为实例变量 func__call__ 方法定义了装饰器的逻辑,在调用被装饰的函数之前和之后执行一些操作。

总结

Python装饰器是一种强大且灵活的语法特性,可以在不修改原始函数代码的情况下修改函数的行为。装饰器可以用来添加额外的功能、验证和授权、修改输入输出等。通过装饰器,可以使代码更加清晰、可维护,并且可以灵活地组合和嵌套使用。掌握装饰器的使用和高级用法,对于程序员来说是一项重要的技能。