代码改变世界

第十二天

2018-04-02 12:02  dalao说得对  阅读(140)  评论(0)    收藏  举报

今天学了:

  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____        打印函数下的备注