您的位置:首页 > 编程语言 > Python开发

python的函数装饰器学习笔记

2015-12-29 00:00 681 查看
摘要: 简单记录了python 的函数装饰器的实现原理

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 修饰符 decorator