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

Python函数decorator(装饰器)用法详解

发布时间:2023-06-10 08:25:16

Python 中,decorator(装饰器)是一种用于动态修改一个函数或类的方式,将其作为参数传递给另一个函数,并返回一个新的函数或类。它是 Python 的一个强大的特性,可以用于很多场景,比如添加日志记录、性能分析、缓存、权限控制等。

装饰器的语法形式使用 @ 符号,在函数定义之前将其放置在函数定义的上方,例如:

@decorator_func
def my_function():
    pass

这相当于将 my_function 函数包装在 decorator_func 函数中,并将其返回一个新的函数。

装饰器函数可以接受一个或多个参数,其返回值也必须是一个函数,例如:

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

@my_decorator
def my_function():
    print("Hello, World!")

my_function()

在这个例子中,my_decorator 函数接受一个参数 func,它代表要被装饰的函数 my_function。在 my_decorator 函数内部,定义了一个新的函数 wrapper,它会在调用 my_function 前后输出一些信息。最后,我们将 wrapper 作为新的函数返回,在 my_function 函数前加上 @my_decorator 就相当于调用了 my_function = my_decorator(my_function)。

通过装饰器可以降低代码重复性,同时也提高了代码的可维护性和可读性。诸如 日志记录、权限控制、缓存、性能测试、参数名称修改 等功能常用装饰器有:

- @staticmethod:静态方法,与类变量有关的操作适宜使用静态方法,静态方法通过类直接调用。

- @classmethod:类方法,与类相关的操作适宜使用类方法,类方法通过类调用。

- @property:属性方法,属性方法在访问属性时自动调用,适合比较简单的变量,通过 property 装饰器定义。

- @memoize:缓存装饰器,节省一些开销,缓存常用的结果,效率提高,加快访问速度。

- @login_required:登录状态装饰器,需求访问页面时必须认证登录,没有认证登录会重定向到认证页面。

此外,Python 也支持自定义装饰器,比如:

def repeat(num):
    def my_decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(num):
                func(*args, **kwargs)
        return wrapper
    return my_decorator

@repeat(num=3)
def say_hello(name):
    print(f"Hello, {name}!")

say_hello("Bob")

通过函数闭包的方式,定义了一个 repeat 函数,它接受一个限制次数的参数 num,返回一个装饰器函数 my_decorator,并在 my_decorator 函数中定义了一个新的函数 wrapper。在 wrapper 函数中,我们使用 for 循环将被装饰函数重复执行多次。最后,将其使用 @repeat(num=3) 定义为装饰器。

可以看到,装饰器既方便,也复杂,通过一定的学习和实践,结合各类场景,灵活使用一定会提高 Python 的开发效率,逐渐精通 Python 起来,玩转 Python 才能更加得心应手。