装饰器与函数的多层嵌套
# coding: utf-8 def login(func): print("the first level") def inner1(*args): print("the second level") def inner2(*args): print("the third level") def inner3(*args): print("the forth level") func(*args) func(*args) return inner3 func(*args) return inner2 return inner1 @login def tv(name,password): print("Welcome [%s] [%s] to TV page" % (name,password) ) print(tv) tv = login(tv) print(tv) tv = tv("zhou","123") print(tv) tv = tv("zhouding","123456") print(tv) tv("zhoudingzhao","12345678")
执行结果如下:
the first level
<function login.<locals>.inner1 at 0x02D94150>
the first level
<function login.<locals>.inner1 at 0x02D94198>
the second level
the second level
Welcome [zhou] [123] to TV page
<function login.<locals>.inner1.<locals>.inner2 at 0x02D941E0>
the third level
the second level
Welcome [zhouding] [123456] to TV page
<function login.<locals>.inner1.<locals>.inner2.<locals>.inner3 at 0x02D94198>
the forth level
the second level
Welcome [zhoudingzhao] [12345678] to TV page
@login 的作用:相当于 tv = login(tv) ,把 tv 函数的内存地址传给login的参数 func ,login 函数返回其内部函数 inner1 的内存地址 给 tv 。当执行 tv 函数 的时候,其实是执行了login的 inner1 函数。