python的函数装饰器学习笔记
jopen
9年前
1 基本函数
首先正常的函数形式和调用方法:
>>> def foo(): ... return 1 >>> foo() 1
2 嵌套函数
基本的嵌套函数形式和调用方法
>>> def outer(): ... x = 1 ... def inner(): ... print x # 1 ... inner() # 2 >>> outer() 1
函数inner所定义在函数outer中。inner可以访问到他的外层函数的变量。
3. 函数即对象
>>> issubclass(int, object) # all objects in Python inherit from a common baseclass True >>> def foo(): ... pass >>> foo.__class__ # 1 <type 'function'> >>> issubclass(foo.__class__, object) True
函数即对象,所以可以将函数当成普通的对象变量一样,可以作为普通的参数,也可以作为一个函数的返回值。
>>> def outer(): ... x = 1 ... def inner(): ... print x+1 ... return inner ... >>> f = outer() >>> f() 2
这里outer函数就是将inner函数返回给f
4 装饰函数
>>> def outer(some_func): ... def inner(): ... print 'before some_func' ... ret = some_func() ... return ret + 1 ... return inner ... >>> def foo(): ... return 1 ... >>> decorated = outer(foo) >>> decorated() before some_func 2 >>>
这里将foo函数当作参数传递给outer函数,outer函数中定义了一个inner函数,inner中调用了传递进来的foo函数,并在调用之行之前打印文字。outer函数酱inner函数返回给decorated(这里并没有执行inner函数)。然后执行decorated()
这里decorated通过outer函数将foo函数装饰了一下(在执行之前打印一句话)
5 使用@装饰符
>>> def outer(some_func): ... def inner(): ... print 'before some_func' ... ret = some_func() ... return ret + 1 ... return inner ... >>> @outer ... def foo(): ... return 1 ... >>> foo() before some_func 2 >>>
这里不再明确的使用调用outer将foo当作参数传递,然后用decorated接受。而直接用@outer放在foo函数定义开头,即可实现使用outer函数装饰foo的功能。之后直接调用foo即可。
6 函数装饰传递参数
>>> def logger(func): ... def inner(*args, **kwargs): ... print "func start" ... func(*args, **kwargs) ... print "func end" ... return inner ... >>> @logger ... def foo(a, b): ... print a + b ... >>> foo(1, 2) func start 3 func end >>>
logger中定义的inner函数用*args和**kwargs接受参数,传递给func函数执行。即完整实现一个函数装饰器的功能,之后用@logger装饰函数foo,在执行foo函数时,能看到在其之前之后打印的语句。
详细学习地址:http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/