python 装饰器初步学习

时间:2022-12-23 00:16:58

第一步 简单函数

1 ''' 简单的函数:调用两次'''
2 def myfunc():
3 print ('myfunc() called.')
4
5 myfunc()
6 myfunc()

第二步 装饰器为调用函数提供附加功能

 1 '''替换函数(装饰)
2 装饰函数的参数是被装饰的函数对象,返回原函数对象
3 装饰的实质语句; myfunc = deco(myfunc)'''
4 def deco(func):
5 print ("before myfunc() called.")
6 func()
7 print (" after myfunc() called.")
8 return func
9
10 def myfunc():
11 print (" myfunc() called.")
12
13 myfunc = deco(myfunc)
14 myfunc()
15 myfunc()

第三步  使用语法 @ 来装饰函数

 1 '''使用语法@来装饰函数,相当于 myfunc = deco(myfun)
2 但新函数只在第一次被调用,且原函数多调用一次'''
3 def deco(func):
4 print ("before myfunc() called.")
5 func()
6 print (" after myfunc() called.")
7 return func
8
9 @deco
10 def myfunc():
11 print (" myfunc() called.")
12
13 myfunc()
14 myfunc()

第四步 使用内嵌包装函数来确保每次新函数都被调用

 1 '''使用内嵌包装函数来确保每次新函数都被调用,
2 内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''
3
4 def deco(func):
5 def _deco():
6 print ("before myfunc() called.")
7 func()
8 print ("after myfunc() called.")
9 # 不需要返回func,实际上应返回原函数的返回值
10 return _deco
11
12 @deco
13 def myfunc():
14 print (" myfunc() called.")
15 return 'ok'
16
17 myfunc()

第五步  对具有参数的函数进行装饰

 1 '''对带参数的函数进行装饰,内嵌包装函数的形参和返回值与原函数相同,
2 装饰函数返回内嵌包装函数对象'''
3
4 def deco(func):
5 def _deco(a, b):
6 print ("before myfunc() called.")
7 f = func(a, b)
8 print ("after myfunc() called.")
9 return f
10 return _deco
11
12 @deco
13 def myfunc(a, b):
14 print (" myfunc(%s, %s) called." %(a, b))
15 return a + b
16
17 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