第一步 简单函数
''' 简单的函数:调用两次'''
def myfunc():
print ('myfunc() called.') myfunc()
myfunc()
第二步 装饰器为调用函数提供附加功能
'''替换函数(装饰)
装饰函数的参数是被装饰的函数对象,返回原函数对象
装饰的实质语句; myfunc = deco(myfunc)'''
def deco(func):
print ("before myfunc() called.")
func()
print (" after myfunc() called.")
return func def myfunc():
print (" myfunc() called.") myfunc = deco(myfunc)
myfunc()
myfunc()
第三步 使用语法 @ 来装饰函数
'''使用语法@来装饰函数,相当于 myfunc = deco(myfun)
但新函数只在第一次被调用,且原函数多调用一次'''
def deco(func):
print ("before myfunc() called.")
func()
print (" after myfunc() called.")
return func @deco
def myfunc():
print (" myfunc() called.") myfunc()
myfunc()
第四步 使用内嵌包装函数来确保每次新函数都被调用
'''使用内嵌包装函数来确保每次新函数都被调用,
内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象''' def deco(func):
def _deco():
print ("before myfunc() called.")
func()
print ("after myfunc() called.")
# 不需要返回func,实际上应返回原函数的返回值
return _deco @deco
def myfunc():
print (" myfunc() called.")
return 'ok' myfunc()
第五步 对具有参数的函数进行装饰
'''对带参数的函数进行装饰,内嵌包装函数的形参和返回值与原函数相同,
装饰函数返回内嵌包装函数对象''' def deco(func):
def _deco(a, b):
print ("before myfunc() called.")
f = func(a, b)
print ("after myfunc() called.")
return f
return _deco @deco
def myfunc(a, b):
print (" myfunc(%s, %s) called." %(a, b))
return a + b print myfunc(1, 2)
更深入的学习会继续!
参考资料:http://blog.csdn.net/thy38/article/details/4471421
http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000