python装饰符不容易理解,查了一些资料,留在这里,以备后查。
先说一下自己的理解:本质上讲,装饰符@类似于回调函数,把其它的函数(暂且称为目的参数)作为自己的入参,在目的函数执行前,执行一些自己的操作,比如:计数、打印一些提示信息等,然后返回目的函数。
先看一段代码
def a(fn):
print 'a'
def d(st):
print st+'d'
return d
def b(fn):
print 'b'
return fn
@a
@b
def c(st):
print st
c('c')
b函数把其它函数作为入参,打印字符b,返回这个函数。
a函数把其它函数作为入参,打印字符a,返回自定义的函数d
它们都是c函数的装饰符,具体的执行为:
b函数把c函数作为入参,打印字符b,返回c函数 ====> a函数把返回的c函数作为入参,打印字符a,返回函数d =======> 函数d执行打印字符cd ===>end
结果为:
b
a
cd
等等,是不是有些不对劲?函数c怎么没有执行
是这样的,因为函数a没有返回它的入参,导致c函数并没有被执行。
我们稍微修改下代码
def a(fn):
print 'a'
def d(st):
print st+'d'
return d
def b(fn):
print 'b'
return fn
@a
@b
def c(st):
print st
c('c')
c('c')
看结果:
b
a
cd
cd
是的,原来的函数c被修改了,修改为函数d了,所以再运行也是函数d,这就是装饰符,很强大的