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/