装饰器小叙

什么是装饰器?

首先,装饰器也是一个函数!!!!

在python中,这种函数接收的参数是函数而已,返回是一个没有实例话的函数.

他实例话的时候需要接收一个funciton

就好比有一个函数 function,有一个装饰器deco

开始装饰啦!!!

1
2
func =function()
decofunc = deco(func)

用的时候这里的function要是实例化之后的哦,也就是function()

哈哈,,是不是和平时用的不太一样,下面给大家看看常用的用法,这样是不是更pythonic一点啦

1
2
3
4
5
6
7
8
9
@deco
def function():pass
if __name__ == '__main__':
'''
用的时候直接使用就好啦 ……^_^
'''
function()

下面有几种实用的场景

不带参数的装饰器(普通装饰器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def deco(func):
def wrapper(*a,**kw):
'''
这里转入的就是函数的参数啦
@需要在内部传入参数
'''
print "wa.....,we put the %s into the box "%func.__name__
result = func(*a,**kw)
return result
return wrapper

当然我们有时候需要给装饰器带点参数

这种场景还是用的比较多的,就好比是在观察者模式里面,一个register需要接收一个postoffice的实例,那么如果每次都我要在程序里面去更改我们的postoffice,那就相当的麻烦了,所以通过这种方式,可以很方便的变更postoffice,我们只需要是实例化注册者就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from functions import wraps
def register_deco(postoffice):
'''
@postoffice:需要接受一个实例话的观察者对象
'''
def deco(register):
@wraps(*a,**kw):
def wrapper(*a,**kw):
result = func(postoffice)
return result
return wrapper
return deco

什么你还想要设置默认值,当然也是可以的

1
from functions import partial

就是这个模块了,方便设置一个带默认值的装饰器,这就可以直接添加了^_^,postoffice是观察者的一个实例

1
2
postinst = Postoffice()
default_post = partial(register_deco,Postinst)

用一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@deco
def func(*a,**kw):
print a
print kw
print "i am a test program"
if __name__ == "__main__":
func()