009python路--装饰器

闭包
如果在一个内部函数中,对在外部作用域
(但不是在全局作用域)的变量进行引用,
 这个内部函数就是闭包

def outer(y):
    x = 10  #xy都是外部变量
    def inner(): #内部函数
        print(x)
    return inner
f = outer()
f()  #调用内层函数

装饰器

  #需求:计算一个函数的修改时间

  def f() : print("....")
  #计时函数te
  def te(funtion):
    start = time.time()
    funtion()
    end = time.time()
    return print(end-start)

  #调用函数,得到运行时间
  te(f)
这样代码改动了业务调用方式,还需进一步的修改
  def f():
    print("....")
  #计时函数te
  def te( funtion ):
    def inner():
      start = time.time()
      funtion()
      end = time.time()
      print(end - start)
    return inner

  f = te(f)  #调用计时函数,得到inner的地址
  f()   #和以前调用的方式一致,还得到了运行时间

  bar = te(bar)
  bar() #再看一个函数时间,再添加一个调用即可
###########语法糖#######################
@te 这等价于 f() = te(f)
def te(f):
  def inner():
    start = time.time()
    f()
    end = time.time()
    print(end-start)
  return inner
@te
def f():print("...")

  函数加上装饰器后,分析函数时,看装饰器。知道到f()会执行函数即可。

  并不会执行一次函数,执行一次装饰器

#需求:计算时间的同时,打印日志。
  #不过是否打印,可以自由控制

  def logger(flag='true'):#默认参数
    def te(f):
      def inner(*a, **b):
        ret = f(*a, **b)

        if flag=='true':#打印日志的函数
          mmmm()
        return ret
      return inner
    return te

  @logger("true")
  def f(*a, **b):print("...")

  f(1, 2)

  #在已有的装饰函数外面,再加一层函数,
  #之后在原装饰的内部判断传入的变量是什么

  #当然这是在,一定要有@的情况下,如果不加@
  #可以撤销@,以te(f,var)来完成

 

posted @ 2018-10-14 15:23  zhaoweiscsuse  阅读(127)  评论(0)    收藏  举报