装饰器,顾名思义,就是给本身的对象加以装饰。动态的将额外的功能添加到已有的对象上。

可以理解成给礼物打包,先将礼物放在盒子里,然后包装盒子。

1
2
3
4
5
6
7
8
9
10
11
def box(func):
def _inner():
print("in box")
func()
return _inner

def gift():
print("I am gift")

gift = box(gift)
gift()

执行结果:

1
2
in box
I am gift

Python在语法上对装饰器进行了支持。

下面的代码和上面的代码等价。

1
2
3
4
5
6
7
8
9
10
11
def box(func):
def _inner():
print("in box")
func()
return _inner

@box
def gift():
print("I am gift")

gift()

当然,也可以加多个装饰器。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def star(func):
def inner(*args, **kwargs):
print("*" * 30)
func(*args, **kwargs)
print("*" * 30)
return inner

def percent(func):
def inner(*args, **kwargs):
print("%" * 30)
func(*args, **kwargs)
print("%" * 30)
return inner

@star
@percent
def printer(msg):
print(msg)

printer("Hello")

执行结果:

1
2
3
4
5
******************************
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Hello
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
******************************

更多装饰器的用法,这篇文章写的很详细。

Reference