day11 装饰器
# 装饰器形成的过程 : 最简单的装饰器 有返回值的 有一个参数的 万能参数的 # 装饰器的作用 # 原则 : 开放封闭原则 # 语法糖 # 装饰器的固定模式 [公式] # def timmer(f): # 计算函数的执行时间 # strat = time.time() # f() # end = time.time() # print(end - strat) import time # print(time.time()) # 从1970.1.1当现在过了多少秒,获取当前时间 # time.sleep(5) # 让程序执行到当前位置的时候 停 指定时间 # def timmer(f): #装饰器函数 # def inner(): # strat = time.time() # ret = f() #被装饰的函数 # end = time.time() # print(end - strat) # return ret # return inner # 注意: !!!传内部函数名 # # # @timmer # 语法糖 @装饰器函数名 # def func(): # 被装饰的函数 # time.sleep(0.01) # print("hello boss,hello mates,hello everyone") # return "新年好" # # # func = timmer(func) # ret = func() # 此时的func()实际上是inner() # print(ret) # 装饰器的作用 ----- 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 # timmer就是一个装饰器函数, 只是对一个函数 有一些装饰作用 # 原则: 开放封闭原则 # 开放: 对扩展是开放的 # 封闭: 对修改是封闭的 # def outer(): # def inner(): # return 'inner' # inner() # outer() # 装饰带参数函数的装饰器 # def timmer(f): #装饰器函数 # def inner(*args, **kwargs): # strat = time.time() # ret = f(*args, **kwargs) #被装饰的函数 # end = time.time() # print(end - strat) # return ret # return inner # 注意: !!!传内部函数名 # # # # @timmer # 语法糖 @装饰器函数名 # def func(a): # 被装饰的函数 # time.sleep(0.01) # print("hello boss,hello mates,hello everyone",a) # return "新年好" # # @timmer # 语法糖 @装饰器函数名 # def func(a, b): # 被装饰的函数 # time.sleep(0.01) # print("hello boss,hello mates,hello everyone",a,b) # return "新年好" # # # func = timmer(func) # ret = func(1, 2) # 此时的func()实际上是inner() # ret = func(1, b=2) # print(ret) # def wrapper(f): #装饰器函数, f是被装饰的函数 # def inner(*args, **kwargs): # '''在被装饰函数之前要做的事''' # ret = f(*args, **kwargs) #被装饰的函数 # '''在被装饰函数之后要做的事''' # return ret # return inner # 注意: !!!传内部函数名 # # # @wrapper # 语法糖 @装饰器函数名 # def func(a, b): # 被装饰的函数 # time.sleep(0.01) # print("hello boss,hello mates,hello everyone",a,b) # return "新年好" def wrapper(func): #qqxing def inner(*args, **kwargs): ret = func(*args, **kwargs) #被装饰的函数 return ret return inner @wrapper # <===> qqxing = wrapper(qqxing) def qqxing(a,b): print(123) ret = qqxing(1,b=[1,2]) #inner() print(ret)
总结:
复习 讲作业 装饰器的进阶 functools.wraps 带参数的装饰器 多个装饰器装饰同一个函数 周末作业 文件操作 字符串处理 输入输出 流程控制 装饰器 开发原则: 开放封闭原则 装饰器的作用: 在不改变原函数的调用方式的情况下,在函数的前后添加功能 装饰器的本质: 闭包函数 def wrapper(f): def inner(*args, **kwargs): print("在被装饰的函数执行之前做的事") ret = f(*args, **kwargs) print("在被装饰的函数执行之后做的事") return ret return inner @wrapper def holiday(day): print('全体放假%s天'%day) return '好开心' ret = holiday(7) print(ret) def outer(*args, **kwargs): print(args) print(*args) def inner(*args): print('inner: ',args) inner(*args) outer(1, 2, 3, 4) # == outer(*[1,2,3,4])