python修饰器

python修饰器

什么是修饰器?

修饰器是一个函数,接收的唯一参数也是一个函数或方法,返回一个再输入函数基础上加以修饰的新的函数或方法(就能附带一些额外的功能)

了解一个简单的栗子

以下就是用代码实现修饰器的功能

1
2
3
4
5
6
7
8
9
10
11
12
def wrapper_func(func):#修饰函数,传入参数为一个函数
def wrapper():
print("我是一个修饰") #修饰
func()#调用函数
print("我也是一个修饰") #修饰
return wrapper

def hello():#待传入的函数
print("我是hello函数!")

test = wrapper_func(hello)#修饰后的结果
test()

输出结果:

1
2
3
我是一个修饰
我是hello函数!
我也是一个修饰

上述代码加上语法糖,代码可以更加简洁:

1
2
3
4
5
6
7
8
9
10
11
def wrapper_func(func):#修饰函数,传入参数为一个函数
def wrapper():
print("我是一个修饰")#修饰
func()#调用函数
print("我也是一个修饰")#修饰
return wrapper

@wrapper_func #修饰器
def hello():#待传入的函数
print("我是hello函数!")
hello()

输出结果同上

修饰器的执行顺序

一个有趣的“汉堡”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def bread(func) :  
def wrapper() :
print("</''' '''\>")
func()
print("<\______/>")
return wrapper

def ingredients(func) :
def wrapper() :
print("#tomatoes#")
func()
print("~salad~")
return wrapper

@bread
@ingredients #等价于bread(ingredients(sandwich))
def sandwich(food="--ham--") :
print(food)
sandwich()

输出结果:

1
2
3
4
5
</'''       '''\>
#tomatoes#
--ham--
~salad~
<\______/>

万能的修饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def w_test(func):
def inner(*args, **kwargs):
ret = func(*args, **kwargs)
return ret

return inner


@w_test
def test():
print('test called')


@w_test
def test1():
print('test1 called')
return 'python'


@w_test
def test2(a):
print('test2 called and value is %d ' % a)

test()
test1()
test2(9)

输出结果:

1
2
3
test called
test1 called
test2 called and value is 9

修饰器的一些用途

装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

比如用于计算函数运行实践的修饰器:

1
2
3
4
5
6
7
8
import time  
def timeit(func):
def wrapper():
start = time.clock()
func()
end =time.clock()
print 'Time Elapsed:', end - start
return wrapper