day12 装饰器
装饰器
装饰器的作用
在不改变函数的调用方式的情况下,给函数的前后添加新功能
# 关于时间 import time # 模块 # time.sleep(1) # print(time.time()) # print('===========') # def timmer(func): # start_time = time.time() # time.sleep(0.1) # func() # end_time = time.time() # print('=====%s====='%(end_time-start_time)) def timmer(func): # timmer是装饰器的名字,传入的参数就是被装饰的函数 def inner(): # 在装饰器中需要定义一个内部函数 print('调用func之前') func() # 被装饰的函数,并且要执行 print('调用func之后') return inner # 将内部函数的名字返回 @timmer # 语法糖 func = timmer(func) def func(): print('ok') func()
有参装饰器
def timmer(func): # timmer是装饰器的名字,传入的参数就是被装饰的函数 def inner(*args,**kwargs): # 在装饰器中需要定义一个内部函数 print('调用func之前') func(*args,**kwargs) # 被装饰的函数,并且要执行 print('调用func之后') return inner # 将内部函数的名字返回 @timmer # 语法糖 func = timmer(func) def func(name): print('%sok'%name) @timmer def func2(a,b): print('func2:%s'%(a+b)) func('Y') func2(5,3) # inner(5,3)
有返回值的装饰器
def timmer(func): # timmer是装饰器的名字,传入的参数就是被装饰的函数 def inner(*args,**kwargs): # 在装饰器中需要定义一个内部函数 print('调用func之前') ret = func(*args,**kwargs) # 被装饰的函数,并且要执行 print('调用func之后') return ret return inner # 将内部函数的名字返回 @timmer # 语法糖 func = timmer(func) def func(name): print('%sok'%name) return 11 ret = func(name='yxt') print(ret)
装饰器的固定结构
def wrapper(func): # timmer是装饰器的名字,传入的参数就是被装饰的函数 def inner(*args,**kwargs): # 在装饰器中需要定义一个内部函数 '''被装饰函数执行之前要添加的代码''' ret = func(*args,**kwargs) # 被装饰的函数,并且要执行 '''被装饰函数执行之后要添加的代码''' return ret return inner # 将内部函数的名字返回
开放封闭原则
开放:
对扩展是开放的
封闭:
对修改是封闭的
装饰器:开放封闭原则
装饰器实例
flag = False def login(func): def inner(*args,**kwargs): global flag if flag == False: username = input('用户名:') password = input('密码:') if username == 'alex' and password == 'somebody': print('登录成功') flag = True if flag == True: ret = func(*args,**kwargs) return ret return inner @login def art(): print('欢迎来到文章页') @login def dar(): print('欢迎来到日记页') art() dar()