博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器与函数的多层嵌套
阅读量:5248 次
发布时间:2019-06-14

本文共 1275 字,大约阅读时间需要 4 分钟。

# coding: utf-8def 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@logindef 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 函数。

转载于:https://www.cnblogs.com/z360519549/p/5185218.html

你可能感兴趣的文章
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
S5PV210根文件系统的制作(一)
查看>>
51NOD 1244 莫比乌斯函数之和
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
数据清洗
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>
C++循环单链表删除连续相邻重复值
查看>>
渣渣小本求职复习之路每天一博客系列——Java基础(3)
查看>>