1. 装饰器简介
装饰器是 Python 中非常重要的一个特性,它充分体现了 Python 动态性和函数对象的概念,让函数装饰变得更加简洁和方便。
装饰器本质上是一个 Python 函数或类,它可以接收其他函数或类作为参数,并返回一个具有新功能的函数或类。
下面是一个简单的装饰器的例子:
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()
,它接收一个函数作为参数,并返回一个内部函数 wrapper()
。这个内部函数接收任意数量的参数,然后调用被装饰的函数 func()
。
我们在 say_hello()
函数上加上 @my_decorator
装饰器,相当于执行了 my_decorator(say_hello)()
,也就是将 say_hello()
函数作为参数传给了装饰器。
最终输出结果为:
Something is happening before the function is called.
Hello!
Something is happening after the function is called.
2. 装饰器的高级用法
2.1 带参数的装饰器
装饰器本身可以带参数,这样就可以定制装饰器的行为,使其更具灵活性。
下面是一个带参数的装饰器的例子:
def repeat(num):
def my_decorator(func):
def wrapper(*args, **kwargs):
for i in range(num):
print("Before {} is called.".format(func.__name__))
func(*args, **kwargs)
print("After {} is called.".format(func.__name__))
return wrapper
return my_decorator
@repeat(num=3)
def say_hello():
print("Hello!")
say_hello()
上述例子中,我们定义了一个带参数的装饰器函数 repeat()
,它接收一个参数 num
,表示要装饰的函数需要被执行的次数。
在装饰器内部,我们定义了一个新的内部函数 wrapper()
,它接收任意数量的参数,并根据传入的 num
参数,来多次调用被装饰的函数。
我们在 say_hello()
函数上加上 @repeat(num=3)
装饰器,相当于执行了 repeat(num=3)(say_hello)()
。
最终输出结果为:
Before say_hello is called.
Hello!
After say_hello is called.
Before say_hello is called.
Hello!
After say_hello is called.
Before say_hello is called.
Hello!
After say_hello is called.
2.2 类装饰器
除了函数装饰器以外,Python 还支持类装饰器。类装饰器可以用来包装函数并添加额外的功能。
下面是一个简单的类装饰器的例子:
class Decorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("Something is happening before the function is called.")
self.func(*args, **kwargs)
print("Something is happening after the function is called.")
@Decorator
def say_hello():
print("Hello!")
say_hello()
上述例子中,我们定义了一个类装饰器 Decorator
,它包装了函数并在函数执行前后添加了额外的功能。
我们在 say_hello()
函数上加上了 @Decorator
装饰器,相当于执行了 Decorator(say_hello)()
,也就是将 say_hello()
函数作为参数传给了 Decorator
类。
最终输出结果为:
Something is happening before the function is called.
Hello!
Something is happening after the function is called.
2.3 函数式装饰器
Python 还支持一种更加简洁的装饰器语法,称为函数式装饰器。
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Something is happening before the function is called.")
func(*args, **kwargs)
print("Something is happening after the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
当我们使用 @my_decorator
装饰器语法时,实际上相当于执行了 say_hello = my_decorator(say_hello)
,将 say_hello()
函数重新赋值为经过装饰器包装之后的函数。
最终输出结果和之前一样。
3. 结语
本文介绍了 Python 装饰器的基本原理和高级用法,包括带参数的装饰器、类装饰器和函数式装饰器。掌握装饰器的使用,可以让我们在不修改原函数代码的情况下,为函数添加额外的功能或者进行修饰,从而提高代码的重用性和可读性。