装饰器
装饰器的作用
在不改变函数的调用方式的情况下,给函数的前后添加新功能
# 关于时间
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()
