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)来完成

浙公网安备 33010602011771号