python的函数装饰器学习笔记
python的函数装饰器学习笔记
子夜闻雪 发表于2年前
python的函数装饰器学习笔记
  • 发表于 2年前
  • 阅读 117
  • 收藏 6
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 简单记录了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/




共有 人打赏支持
粉丝 3
博文 31
码字总数 15049
×
子夜闻雪
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: