date: 2021-06-12title: Python装饰器 #标题
tags: python #标签
categories: python # 分类
记录下python装饰器的代码格式。参考:
这里只是简单记录下代码,如果想研究装饰器具体原理,可以参考上面两个链接。
装饰器基础代码
'''
timmer作为一个装饰器
@timmer 被称之为语法糖
想要哪个函数使用定义好的装饰器
只需在对应的函数上一行写上语法糖即可
下面的代码是实现计算某个函数的执行效率
'''
import time
# 定义装饰器函数
def timmer(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print(f'代码运行时间为{end_time - start_time}秒')
return inner
@timmer # 此语法糖等同于 bokeyuan=timmer(bokeyuan)
def bokeyuan():
time.sleep(2)
print('欢迎登录博客园首页')
@timmer # 此语法糖等同于 houtai=timmer(houtai)
def houtai():
time.sleep(3)
print('欢迎登录博客园后台')
bokeyuan()
houtai()
装饰器带返回值
import time
def timmer(f):
def inner():
start_time = time.time()
ret = f() # 定义变量接受函数的返回值
end_time = time.time()
print(f'代码运行时间为{end_time - start_time}秒。')
return ret # 将真正函数的返回值返回给调用者
return inner
@timmer
def index():
time.sleep(2)
print('欢迎登录博客园...')
return 666
print(index())
# 输出结果如下:
欢迎登录博客园...
代码运行时间为2.000514268875122秒。
666
带参数的装饰器
import time
def timmer(f):
def inner(*args, **kwargs): # 1、inner函数接收参数
start_time = time.time()
ret = f(*args, **kwargs) # 2、然后传递给真正的函数
end_time = time.time()
print(f'代码运行时间为{end_time - start_time}秒。')
return ret
return inner
@timmer
def index(name, age):
time.sleep(2)
print(f'欢迎{age}岁的{name}登录博客园...')
return 666
index(name='lvjianzhao', age=18)
规范的装饰器代码
def zsq(f):
def inner(*args, **kwargs):
# 执行真正函数之前要做的事
ret = f(*args, **kwargs) # 执行真正的函数
# 执行真正函数之后要做的事
return ret
return inner
@zsq
def login(name, age):
print(f'欢迎{age}岁的{name}登录。')
login(name='吕建钊', age=18)
模仿登录验证页面
userlist = {'zhangsan': '123.com'}
status_dict = {
'username': None,
'status': False
}
def login():
conut = 0
while conut < 3:
conut += 1
name = input('请输入用户名:').strip()
passwd = input('请输入密码:').strip()
if name in userlist and passwd == userlist[name]:
status_dict['username'] = name
status_dict['status'] = True
return '登录成功'
else:
print('用户名或密码错误,请重新输入!')
continue
else:
print('登录次数超过三次,请稍后再试!')
exit(1)
def auth(f):
def inner(*args, **kwargs):
if status_dict['status']:
ret = f(*args, **kwargs)
return ret
else:
login()
if status_dict['status']:
ret = f(*args, **kwargs)
return ret
return '登录失败'
return inner
@auth
def index():
print('欢迎访问博客首页')
@auth
def comment():
print('欢迎访问评论页面')
@auth
def rili():
print(f'欢迎访问日历页面,当前用户为;{status_dict["username"]}')
index()
comment()
rili()
带参数的装饰器2
原理讲解起来有点多,建议观看 老男孩视频:带参数的装饰器 来理解。
# 带参数的装饰器基础代码规范
def logger(path):
def log(func):
def inner(*args, **kwargs):
# 函数执行前要做的事情
# pass
# 执行真正的函数
# ret=func(*args,**kwargs)
# 函数执行后要做的事情
# pass
# return ret
return inner
return log
下面是一个简单的功能,装饰器的功能是打印日志,但多了一个功能就是将不同函数的日志打印到不同文件中。
import time
# 比起之前的装饰器,又多了一层,以便将日志路径设置为自由变量
def logger(path):
def log(func):
def inner(*args, **kwargs):
ret = func(*args, **kwargs)
with open(path, encoding='utf-8', mode='a+') as f:
f.write(f'{time.strftime("%Y-%m-%d %H:%M:%S")} 调用了{func.__name__} 函数')
return inner
return log
@logger(r'C:\Users\Administrator\Desktop\auth.log') # 这里将日志路径给传参到装饰器中
def auth():
print('登录成功!')
@logger(r'C:\Users\Administrator\Desktop\registry.log') # 这里将日志路径给传参到装饰器中
def registry():
print('注册成功!')
auth()
registry()