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 timedef timmer(f):def inner():start_time = time.time()ret = f() # 定义变量接受函数的返回值end_time = time.time()print(f'代码运行时间为{end_time - start_time}秒。')return ret # 将真正函数的返回值返回给调用者return inner@timmerdef index():time.sleep(2)print('欢迎登录博客园...')return 666print(index())# 输出结果如下:欢迎登录博客园...代码运行时间为2.000514268875122秒。666
带参数的装饰器
import timedef 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 retreturn inner@timmerdef index(name, age):time.sleep(2)print(f'欢迎{age}岁的{name}登录博客园...')return 666index(name='lvjianzhao', age=18)
规范的装饰器代码
def zsq(f):def inner(*args, **kwargs):# 执行真正函数之前要做的事ret = f(*args, **kwargs) # 执行真正的函数# 执行真正函数之后要做的事return retreturn inner@zsqdef login(name, age):print(f'欢迎{age}岁的{name}登录。')login(name='吕建钊', age=18)
模仿登录验证页面
userlist = {'zhangsan': '123.com'}status_dict = {'username': None,'status': False}def login():conut = 0while conut < 3:conut += 1name = input('请输入用户名:').strip()passwd = input('请输入密码:').strip()if name in userlist and passwd == userlist[name]:status_dict['username'] = namestatus_dict['status'] = Truereturn '登录成功'else:print('用户名或密码错误,请重新输入!')continueelse:print('登录次数超过三次,请稍后再试!')exit(1)def auth(f):def inner(*args, **kwargs):if status_dict['status']:ret = f(*args, **kwargs)return retelse:login()if status_dict['status']:ret = f(*args, **kwargs)return retreturn '登录失败'return inner@authdef index():print('欢迎访问博客首页')@authdef comment():print('欢迎访问评论页面')@authdef 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()
