因为昨晚刚写的那篇博客,今天上午起来就跑了一遍代码,终于弄得更清楚了一些
那么装饰器为什么要建立在嵌套函数上呢
我们有必要提一下闭包的特点:
1.嵌套
2.返回内层函数
3.有私有变量
还是,以昨晚的例子来看:
def world(fn):
fn()
print('world')
return fn
@world
def hello():
print('hello')
这里单独运行hello()函数的时候,只会打印hello。因为,返回值就是hello本身。那么我们将world()函数作为函数返回呢?是不是就会打印出hello world呢?
def world(fn):
fn()
print('world')
return world
@world
def hello():
print('hello')
运行hello()会报错,因为这时候hello已经被替换为world,因此缺少一个参数。但是,这个参数应该是什么呢?原来的hello()已经没有了,现在的world与hello指向同一个函数。把任意一个当做参数传入,运行hello(world/hello),会一直提醒缺少一个参数。
所以,一层函数无论返回什么,都无法实现完整的功能。
那我们引入闭包,使用嵌套呢?
def world_out(fn):
def world_in():
fn()
print('world')
return world_in
@world_out
def hello():
print('hello')
hello()
这是前面一篇博客里面提到的代码。
我们将额外的print()语句封装到了内层函数,接着返回内层函数。这样原来的函数名就指向新的拥有完整功能的函数了。