zoukankan      html  css  js  c++  java
  • 第十二天

    今天学了:

      1、带参数的装饰器:

        

    def func1(flag):
          def fucn2(f)
            def func3(*args,**kwargs)
                r = f(*args,**kwargs)
                return r
          return func3
    return func2
    
    @func1(flag)        #此时执行的是1、func1(flag)  2、@func2
    def f()
       pass
       return Ture
    
    flag = w
    
    f()
    

      不知道有什么用

      课上用的是去掉多个函数的语法糖的问题,是用一个标志位flag。但事实证明不用带参数的装饰器也可以实现

      不用的话,用if语句判定flag

      用的话,flag写在最外层的函数的参数中

      2、多个装饰器装饰一个函数

    def wrapper1(func):
        def inner():
            print('wrapper1 ,before func')
            func()
            print('wrapper1 ,after func')
        return inner
    
    def wrapper2(func):
        def inner():
            print('wrapper2 ,before func')
            func()
            print('wrapper2 ,after func')
        return inner
    
    def wrapper3(func):
        def inner():
            print('wrapper3 ,before func')
            func()
            print('wrapper3 ,after func')
        return inner
    
    @wrapper3
    @wrapper2
    @wrapper1
    def f():
        print('in f')
    
    f()
    

      执行时顺序是   wrapper3的第一句--->wrapper2的第一句--->wrapper1的第一句--->  f  --->wrapper1的第二句--->wrapper2的第二句--->wrapper3的第二句

      原理:执行时先执行离该函数最近的装饰器,此处为wrapper1;

         执行wrapper1时,读取内部的inner函数,然后返回,此时的f为wrapper1中的inner(1)

         随后执行wrapper2,读取内部的inner函数,然后返回,此时的f为wrapper2中的inner(2)

         随后执行wrapper3,读取内部的inner函数,然后返回,此时的f为wrapper3中的inner(3)

         然后执行f,因为此时的func为wrapper3中的inner,故先执行inner(3),打印出第一行,遇到了func(),

         因为wrapper3中的参数func是wrapper2的inner,所以执行inner(2),打印出第一行,又遇到了func(),

         又因为wrapper2中的参数func是wrapper1中的inner,所以执行inner(1),打印出第一行,遇到了func(),

         wrapper1中的参数func是函数f,所以此时执行f

         执行完毕f,继续走inner(1)下面的部分,打印出inner(1)的第二句,

         此时wrapper2中的func()执行完毕,执行下面的部分,打印出inner(2)的第二句,

         此时wrapper3中的func()执行完毕,执行下面的部分,打印出inner(3)的第二句,程序执行完毕。

        以上7步就是执行的步骤。

    随后还有一些小的碎知识点:

        _____name_____      打印函数名

        ____doc____        打印函数下的备注

  • 相关阅读:
    hadoop大数据平台架构之DKhadoop详解
    越狱设备看不到系统文件夹
    iOS开发 调试 网络限速
    关于OCMock的一些事儿
    Cannot proceed with delivery: an existing transporter instance is currently uploading this package
    windows安装nose
    IE6支持png半透明图片
    ie下web常见错误和差异及解决方案
    js,php下 css颜色加深、减淡,css颜色递进的方法
    html+css div百分百占满正行的两种方法
  • 原文地址:https://www.cnblogs.com/ylx900/p/8692310.html
Copyright © 2011-2022 走看看