Python函数decorator(装饰器)用法详解
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 才能更加得心应手。
