python decorator
这个也非常有意思,函数真的在python中地位很高呀,很多特性感觉都是特意为函数而设计的
decorator就是对函数的,外围的一个修改,找不到一个合适的比喻呀,可能跟细胞核,跟细胞膜的关系吧,对进入细胞核的东西,先做一个检查,或者修饰,形成一个新的整体。
最简单的例子
def first(func):
def wrapper(*args,**kwargs):
print 'first'
func()
print 'finish first'
return wrapper
这个函数不会执行wrapper,但会返回wrapper,所以我们该怎么调用呢?
def foo():
print 'test'
b=first(foo)
b()
这样就可以调用了,或者可以first(foo)()这样子调用,这个函数就是执行wrapper
输出的结果就是:
first
test
finish first
这样子很麻烦了,所以就有了语法糖
@first
def foo():
print 'test'
foo()------->输出同样的结果呀,感觉不错呀
这个问题结束了又有一个更复杂的问题就是多次使用decorator会怎么样呢?
@first
@second
def foo():
print 'test'
foo()-------?结果会怎么样呢
写一个second decorator
def second(func):
def wrapper(*args,**kwargs):
print 'second'
func()
print 'finish second'
return wrapper
结果是什么呢?
first
second
test
finish second
finish first
比较明显这个一个递归的样子?
其实为什么会有递归的样子呢?这个又要回到我们第一个例子中,了解他们是怎么调用wrapper,
我想应该是这样子的
先运行first------>返回了第一个wrapper--->执行地一个wrapper--->print fist-->func()但是这个时候的func到底是什么呢,所以解析器应该去使用第二个decorator--->返回第二个wrapper--->运行第二个wrapper---->print 'second' --->run func()那么这个时候的func是什么呢,肯定是foo---->print test -->继续运行print finish second --->返回到第一个wrapper中,执行func()下面的代码 ---->print finish first
这边还碰到一个问题,就是一旦函数被wrapper就会丢失自己的一些属性,所以解决的办法就是加上@wraps
eg:
from functools import wraps
def first(func):
@wraps
def wrapper():
print 'wrapper"
return wrapper