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/




转载于:https://my.oschina.net/u/2299936/blog/552971

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值