Python 装饰器

装饰器(Decorator)是 Python 中的一种高级函数,它允许你在不修改函数定义的情况下,动态地扩展或修改函数的功能。装饰器本质上是一个返回函数的函数,可以将一个函数作为输入,并返回一个增强后的函数。

装饰器的基本概念

装饰器通常用于以下几种场景:

  1. 增强函数功能:在不改变原函数代码的情况下,添加额外的功能。
  2. 代码复用:通过装饰器,可以将一些常用的功能封装起来,避免代码重复。
  3. 代码清晰:使用装饰器可以使代码结构更加清晰和模块化。

装饰器的基本语法

装饰器的基本语法使用 @ 符号,放在函数定义的前一行。例如:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

在这个例子中, my_decorator 是一个装饰器,它接收一个函数 func 作为参数,并返回一个新的函数 wrapper。当你调用 say_hello() 时,实际上调用的是 wrapper 函数,从而在不修改 say_hello 函数的情况下,扩展了它的功能。

带参数的装饰器

装饰器不仅可以用于不带参数的函数,也可以用于带参数的函数。例如:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

在这个例子中, wrapper 函数使用了 *args**kwargs 来接受所有位置参数和关键字参数,并将这些参数传递给 func,确保装饰器可以用于任意参数的函数。

带参数的装饰器函数

如果你需要让装饰器本身接受参数,可以使用三层嵌套的函数结构。例如:

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def say_hello():
    print("Hello!")

say_hello()

在这个例子中,repeat 是一个返回装饰器的函数,它接收一个参数 n,表示需要调用的次数。 decorator 是实际的装饰器,而 wrapper 是增强后的函数。

总结

装饰器是一个强大的工具,允许你在不改变函数定义的情况下,动态地扩展或修改函数的行为。它们广泛应用于日志记录、性能测量、访问控制等场景。通过使用装饰器,可以使代码更加模块化、清晰和可维护。

posted @ 2024-09-21 15:58  Undefined443  阅读(8)  评论(0编辑  收藏  举报