zoukankan      html  css  js  c++  java
  • 多个装饰器

    # .参加多个装饰器的加载,运行分析(了解)

    def deco1(func1): # func1=wrapper2的内存地址
    def wrapper1(*args, **kwargs):
    print('正在运行====>deco1.wrapper1')
    res1 = func1(*args, **kwargs)
    return res1

    return wrapper1


    def deco2(func2): # func2=wrapper3的内存地址
    def wrapper2(*args, **kwargs):
    print('正在运行====>deco2.wrapper2')
    res2 = func2(*args, **kwargs)
    return res2

    return wrapper2


    def deco3(x):
    def outter3(func3): # func3=被装饰对象index函数(39行代码)的内存地址(这是要掌握的一个本质问题)
    def wrapper3(*args, **kwargs):
    print('正在运行====>deco3.outter3.wrapper3')
    res3 = func3(*args, **kwargs)
    return res3

    return wrapper3

    return outter3


    # 加载顺序自下而上
    @deco1 # index=decco1(wrapper2的内存地址) ---->index=wrapper1的内存地址
    @deco2 # index=deco2(wrapper3的内存地址)------>index=wrapper2的内存地址
    @deco3(111) # ===>@outter3--->index=wrapper3(index)---->最得到的是wrapper3的内存地址
    def index(x, y): # 无论外面套多少层,最终还是用index()偷梁换柱成wrapper()
    print('from index %s:%s' % (x, y))


    # index(1,2)
    print(index) # 这里最后得到的应该是deco1下对应的wrappe1的内存地址

    # 执行顺序:自上而下,wrapper1-->wrapper2-->wrapper3(index) *******重点********
    index(12) # wrapper1

    # 先运行wrapper1,打印出内容后,调用到func1(也就是wrapper2)
    # 运行wrapper2,打印出内容后,调用func2(也就是wrapper3)
    # 运行wrapper3,打印内容,调用funcu3(也就是index)
    # 运行index,也就是打印出(from index x,y的内容38)
    # wrapper3结束
    # wrapper2结束
    # wrapper1结束
  • 相关阅读:
    ML与NLP的2019年度总结与展望
    python在文本开头插入一行的实例
    Git Notes
    warmup 预热学习率
    python error整理
    python 中字符串处理
    集成学习voting Classifier在sklearn中的实现
    机器学习 评价指标整理
    PaddlePaddle Notes
    linux 常用指令 文件操作trick等
  • 原文地址:https://www.cnblogs.com/xiaoxuanworking/p/14354066.html
Copyright © 2011-2022 走看看