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

Python中的装饰器函数:介绍及使用教程

发布时间:2023-06-07 15:59:25

什么是装饰器函数?

装饰器函数是指在不改变函数本身的情况下,将函数包装在另一个函数里,以扩展目标函数的功能。

例如,如果要在函数运行时添加日志记录、缓存或权限检查,装饰器就可以派上用场。然而,将这些功能分散在每个函数中编写代码是繁琐且不易维护的。相反,使用装饰器可以将这些功能抽象出来,并将它们统一地应用于多个函数。

如何定义装饰器函数?

定义装饰器函数需要注意以下几点:

1. 装饰器函数必须接收一个函数作为它的 个参数,这个函数是需要被指定的目标函数。

2. 装饰器函数必须返回一个新函数并将目标函数作为入参传递给新函数。

3. 新函数需要执行目标函数并进行必要的操作以扩展目标函数的功能。

下面是一个简单的例子,演示如何定义一个装饰器函数:

def my_decorator(func):
    def wrapper():
        print("Before the function is called.")
        func()
        print("After the function is called.")
    return wrapper

如何使用装饰器函数?

要使用装饰器函数,需要使用 @ 符号在函数定义前面指定它。例如:

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

这将等同于:

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

say_hello = my_decorator(say_hello)

现在,每当调用 say_hello() 时,它都会在执行前后输出一些文本。例如:

say_hello()
# Output:
# Before the function is called.
# Hello!
# After the function is called.

多个装饰器

如果有多个装饰器需要应用在同一个函数上,可以在函数定义前使用多个 @ 符号指定它们,从而指定装饰器的顺序。例如:

@decorator1
@decorator2
def my_function():
    print("Hello!")

这等同于:

def my_function():
    print("Hello!")

my_function = decorator1(decorator2(my_function))

注意,装饰器的执行顺序是从上到下,但它们的顺序是从下到上应用的。因此,在上面的例子中,先应用 decorator2,然后是 decorator1。

参数化装饰器

您还可以编写带有参数的装饰器,方法是在装饰器函数周围添加一层函数层。例如:

def repeat(num):
    def my_decorator(func):
        def wrapper():
            for i in range(num):
                func()
        return wrapper
    return my_decorator

这个装饰器函数接收一个 num 参数,然后返回一个装饰器函数。该装饰器函数接收一个 func 参数,然后返回一个新函数 wrapper,用于重复调用 func。

使用带有参数的装饰器函数时需要注意,必须在装饰器函数周围添加两层函数,如下面的例子所示:

@repeat(num=2)
def say_hello():
    print("Hello!")

say_hello()
# Output:
# Hello!
# Hello!

总结

装饰器是一种高级 Python 技术,可以使代码更简洁和易于维护。它可以通过将多个相似的功能集中在一起来减少重复代码,并在运行时修改函数的行为。在 Python 的许多流行框架和库中均使用了装饰器,因此,了解如何创建自己的装饰器是一种重要的技能。