最近很多人问我关于Python装饰器的问题,我把它总结成blog方便他人和自己。
借鉴了这篇关于装饰器的博文,http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html。同时加入了自己的补充和心得。
我用Python IDE来调试,用了Python3.4.2。输出用>>>表示。
第一步:编写一个最简单的函数
#!/usr/bin/env python
def myfunc():
print('myfunc() called')
myfunc()
>>>myfunc() called
第二步:使用装饰函数在函数执行前后分别附加额外功能
#!/usr/bin/env python
def deco(func):
print('before myfunc() called')
func()
print('after myfunc() called')
return func
def myfunc():
print('myfunc() called')
deco(myfunc)
>>>before myfunc() called
>>>myfunc() called
>>>after myfunc() called
如果调用函数改为:
myfunc = deco(myfunc)
myfunc()
>>>before myfunc() called
>>>myfunc() called
>>>after myfunc() called
>>>myfunc() called <====myfunc()的输出
如果调用函数改为:
myfunc = deco(myfunc)
>>>before myfunc() called
>>>myfunc() called
>>>after myfunc() called
第三步:使用棉花糖@语法来装饰函数
#!/usr/bin/env python
def deco(func):
print('before myfunc() called')
func()
print('after myfunc() called')
return func
@deco
def myfunc():
print('myfunc() called')
myfunc()
>>>before myfunc() called
>>>myfunc() called
>>>after myfunc() called
>>>myfunc() called
解析:调用myfunc(),实际上等于 deco(myfunc)()
如果改为: