python 装饰器,登录小练习
目录
- 装饰器
- 无参装饰器
- 有参装装饰器
- 多层装饰器
- 作业
- 1
- 2
装饰器
无参装饰器
装饰器
import time
def timmer(func):def wrapper(*args, **keargs):start = time.time()res = indexstop = time.time()print('run time is %f' % (stop - start))return wrapper@timmer # 装饰器 index = timmel(index)
def index():time.sleep(3) # 把函数运行时间延长三秒print('welconme!')index() # timmer(index()) 个人理解
import timedef timmer(func): # 闭包函数def wrapper():print(func)start_time=time.time()func()stop_time=time.time()print('run time is %f'%(stop_time-start_time))return wrapper@timmer # 装饰语法
def index(): # 被装饰对象time.sleep(3)print('welcome!')index()#上面的运行结果
<function index at 0x10217b9d8>
welcome!
run time is 3.000330
import time
def timmer(func):def wrapper(*args,**kwargs):start_time=time.time()func(*args,**kwargs)stop_time=time.time()print('tun time is %f'% (stop_time-start_time))return wrapper@timmer
def home(name):time.sleep(2)print("welconme to %s!"% name)@timmer
def auth(name,passwd):print(name,passwd)@timmer
def tell():print('-'*20)home('egon')
auth('alex','123')
tell()
#上面运行结果
welconme to egon!
tun time is 2.002392
alex 123
tun time is 0.000015
--------------------
tun time is 0.000007
import time
def timmer(func): #计算函数运行时间def wrapper(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs) #func(*args,**kwargs) 如果不赋值,最终打印出来的结果会出现None stop_time=time.time()print('tun time is %f'% (stop_time-start_time))return res # 要是用到返回值,装饰器也和被装饰的函数一样需要返回值 returnreturn wrapper@timmer
def my_max(x,y): #返回最大值print('from to my_max')res=x if x>y else yreturn resprint(my_max(2,3))
有参装装饰器
def auth2(auth_type):def auth(func):def wrapper(*args,**kwargs):if auth_type == 'file':name=input("username: ")passwd=input("password: ")if name == 'name' and passwd=='123':print('auth successfull')res=func(*args,**kwargs)return reselse:print("auth error")elif auth_type=='sql':print('还不会')return wrapperreturn auth@auth2( auth_type = 'sql' ) # auth index = auth (index)
def index():print('welcome to index.')index()
多层装饰器
# 无参
@ccc
@bbb
@aaa
def func():passfunc=aaa(func)
func=bbb(aaa(func))
func=ccc(bbb(aaa(func)))# 有参
@ccc('c')
@bbb('b')
@aaa('a')
def func():pass
# @aaa('a')
func=aaa('a')(func)
# @bbb('b')
func=bbb('b')(aaa('a')(func))
# @ccc('c')
func=ccc('c')(bbb('b')(aaa('a')(func)))
重复认证
courent_login={'name':None,'login':False} # 登录状态
def auth2(auth_type='file'): # 加了默认参数def auth(func):def wrapper(*args,**kwargs):if courent_login['name'] and courent_login['login']: # 判断是否登录res=func(*args,**kwargs)return res # 已登录直接返回数据if auth_type == 'file':name=input("username: ")passwd=input("password: ")if name == 'name' and passwd=='123':print('auth successfull')res=func(*args,**kwargs)courent_login['name']=name # 把登录的用户添加到登录状态里面courent_login['login']=True # 把当前用户登录状态添加到courent_loginreturn reselse:print("auth error")elif auth_type=='sql':print('还不会')return wrapperreturn auth
# 定义阶段
@auth2( auth_type = 'file' ) # auth index = auth (index)
def index():print('welcome to index.')@auth2()
def home():print("from to index")# 调用阶段
index()
home()
作业
1
import time
def timmer(func):def wrapper(*args, **kwargs):start = time.time()func(*args,**kwargs)stop = time.time()print('run time is %f' % (stop - start))return wrapper
# 装饰器 index = timmel(index)
@timmer
def index(): # 无参函数time.sleep(3) # 把函数运行时间延长三秒print('welconme!')@timmer
def auth(name,passwd): # 有参函数 两个参数print(name,passwd)@timmer
def home(name): # 有参函数 一个参数print(name)index()
auth("egon",'passwd')
home('name')
2
以装饰器来3次登录,不更改源代码的情况下,增加计算函数运行时间
import os,timetag = True
usr_dict = {}
courent_login={'name':None,'login':False} # 避免重复登录
# 计算函数运行时间
def timmer(func):def wrapper(*args, **kwargs):start = time.time()func(*args,**kwargs)stop = time.time()print('run time is %f' % (stop - start))return wrapperdef auth2(auth_type='file'): # 加了默认参数auth_type='file'def auth(func):def wrapper(*args,**kwargs):if courent_login['name'] and courent_login['login']:res=func(*args,**kwargs)return resif auth_type == 'file':with open("usr.conf", encoding="utf8") as usr_file, open("usr1.conf", encoding="utf8", mode="w") as usr1_file:usr_name = usr_file.read()usr_dict = eval(usr_name)count = 0tag = Truewhile tag:usrname = input("\t输入'q',退出\nplease username:").strip()if usrname in usr_dict.keys() :passwd = input("please password:").strip()if int(usr_dict[usrname][1]) < 3 and count < 5:if passwd == usr_dict[usrname][0]:res=func(*args,**kwargs)courent_login['name']=usrnamecourent_login['login']=Truereturn reselse:usr_dict[usrname][1] = int(usr_dict[usrname][1]) + 1print("username or password is wrong")usr = str(usr_dict)usr1_file.write(usr)usr1_file.flush()os.rename("usr.conf", "usr2.conf")os.rename("usr1.conf", "usr.conf")else:print("User is locked")continueelif usrname == 'q':print(usr_dict)usr=str(usr_dict)usr1_file.write(usr)usr1_file.flush()os.rename("usr.conf", "usr2.conf")os.rename("usr1.conf", "usr.conf")breakelse:if usrname != usr_dict.keys():count += 1print("not username")elif auth_type=='sql':print("还不会")return wrapperreturn auth@timmer
@auth2(auth_type='file')
def index():print("welcome!")@timmer
@auth2()
def home():print("from to home")index()
home()
转载于:https://www.cnblogs.com/hyhnm/p/6691379.html
python 装饰器,登录小练习相关推荐
- Python: 装饰器的小例子
折腾了一天的装饰器,貌似理解了其中的一点点... #!/usr/bin/env python3 #coding=utf-8 import getpass from netmiko import Con ...
- python简单装饰器_简单介绍Python装饰器(一)
装饰器的作用 相信大家在 探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍. 这次小冰也来讲解一下关于Python装饰器的一些小知识. 它的作用: 性能测试 日志 安全验证 ...... 相信大 ...
- python装饰器作用噜咕_python 装饰器的实际作用有哪些
终于知道python的装饰器是怎么回事,那在工作中,到底能干吗用呢? 尤其对我这个只会写写脚本又不做python开发的小测试/手动无辜脸. 先说结论,肯定是有用处滴. 一.自动化测试中使用 就拿写的自 ...
- Python装饰器详解,详细介绍它的应用场景
装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 ...
- 一文读懂Python 装饰器函数
[摘要] Python装饰器的学习笔记 1. 初识装饰器 接下来,我们通过一个例子来为大家讲解这个装饰器: 需求介绍:你现在xx科技有限公司的开发部分任职,领导给你一个业务需求让你完成:让你写代码测试 ...
- Python装饰器——四两拨千斤还是杀鸡用牛刀?
一.引言 最近做了一个小小小项目,写了一些偏工程的代码.项目的目的看起来很简单,就是去组里的一个能显示调试信息网站上,根据我们提供的一堆查询,获取调试信息的response,然后离线的解析来完成后续实 ...
- python 装饰器实现事件绑定_Python装饰器实现几类验证功能做法实例
最近新需求来了,要给系统增加几个资源权限.尽量减少代码的改动和程序的复杂程度.所以还是使用装饰器比较科学 之前用了一些登录验证的现成装饰器模块.然后仿写一些用户管理部分的权限装饰器. 比如下面这种 调 ...
- python装饰器-Python——装饰器(Decorator)
1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...
- python装饰器原理-Python装饰器原理与用法分析
这篇文章主要介绍了Python装饰器原理与用法,结合实例形式分析了Python装饰器的概念.原理.使用方法及相关操作注意事项,需要的朋友可以参考下 本文实例讲述了Python装饰器原理与用法.分享给大 ...
- python装饰器作用-Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
最新文章
- 分布式架构的前世今生...
- Nginx反向代理之HTTP 请求头中的 X-Forwarded-For
- idea findbugs使用_IDEA如何协同开发统一代码风格?编码不规范如何解决?
- 格雷码 Gray Code
- php微信聊天机器人_使用图灵机器人api搭建微信聊天机器人php实现
- 充分统计(sufficient statistic) 理解
- LABVIEW 学习-温度采集系统
- 唱响艾泽拉斯_情感篇
- 微生物群落基于KEGG预测功能的丰度分布图绘制
- c语言中变量属性,C语言学习笔记--C语言中变量的属性关键字
- 关于 类的常成员函数 声明和定义处 都需要加 const的原因
- 电商运营风向标:数据分析。
- ElasticSearch学习笔记(八)Java AP实现增删改查
- 综合案例——手写数字图像处理算法比较
- 【c++】factory的使用:create和destory,以cicadaplayer的render实现为例
- 2.04 标志寄存器
- Java虚拟机:Java虚拟机编译器
- Flume-----八种采集方案
- 计算机找不到指纹登陆,Win10电脑上登陆选项没有PIN码和指纹设置的解决教程
- 云队友丨王兴:九败一胜,百炼成钢