目录

  • 装饰器

    • 无参装饰器
    • 有参装装饰器
    • 多层装饰器
  • 作业
    • 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 装饰器,登录小练习相关推荐

  1. Python: 装饰器的小例子

    折腾了一天的装饰器,貌似理解了其中的一点点... #!/usr/bin/env python3 #coding=utf-8 import getpass from netmiko import Con ...

  2. python简单装饰器_简单介绍Python装饰器(一)

    装饰器的作用 相信大家在 探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍. 这次小冰也来讲解一下关于Python装饰器的一些小知识. 它的作用: 性能测试 日志 安全验证 ...... 相信大 ...

  3. python装饰器作用噜咕_python 装饰器的实际作用有哪些

    终于知道python的装饰器是怎么回事,那在工作中,到底能干吗用呢? 尤其对我这个只会写写脚本又不做python开发的小测试/手动无辜脸. 先说结论,肯定是有用处滴. 一.自动化测试中使用 就拿写的自 ...

  4. Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 ...

  5. 一文读懂Python 装饰器函数

    [摘要] Python装饰器的学习笔记 1. 初识装饰器 接下来,我们通过一个例子来为大家讲解这个装饰器: 需求介绍:你现在xx科技有限公司的开发部分任职,领导给你一个业务需求让你完成:让你写代码测试 ...

  6. Python装饰器——四两拨千斤还是杀鸡用牛刀?

    一.引言 最近做了一个小小小项目,写了一些偏工程的代码.项目的目的看起来很简单,就是去组里的一个能显示调试信息网站上,根据我们提供的一堆查询,获取调试信息的response,然后离线的解析来完成后续实 ...

  7. python 装饰器实现事件绑定_Python装饰器实现几类验证功能做法实例

    最近新需求来了,要给系统增加几个资源权限.尽量减少代码的改动和程序的复杂程度.所以还是使用装饰器比较科学 之前用了一些登录验证的现成装饰器模块.然后仿写一些用户管理部分的权限装饰器. 比如下面这种 调 ...

  8. python装饰器-Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...

  9. python装饰器原理-Python装饰器原理与用法分析

    这篇文章主要介绍了Python装饰器原理与用法,结合实例形式分析了Python装饰器的概念.原理.使用方法及相关操作注意事项,需要的朋友可以参考下 本文实例讲述了Python装饰器原理与用法.分享给大 ...

  10. python装饰器作用-Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

最新文章

  1. 分布式架构的前世今生...
  2. Nginx反向代理之HTTP 请求头中的 X-Forwarded-For
  3. idea findbugs使用_IDEA如何协同开发统一代码风格?编码不规范如何解决?
  4. 格雷码 Gray Code
  5. php微信聊天机器人_使用图灵机器人api搭建微信聊天机器人php实现
  6. 充分统计(sufficient statistic) 理解
  7. LABVIEW 学习-温度采集系统
  8. 唱响艾泽拉斯_情感篇
  9. 微生物群落基于KEGG预测功能的丰度分布图绘制
  10. c语言中变量属性,C语言学习笔记--C语言中变量的属性关键字
  11. 关于 类的常成员函数 声明和定义处 都需要加 const的原因
  12. 电商运营风向标:数据分析。
  13. ElasticSearch学习笔记(八)Java AP实现增删改查
  14. 综合案例——手写数字图像处理算法比较
  15. 【c++】factory的使用:create和destory,以cicadaplayer的render实现为例
  16. 2.04 标志寄存器
  17. Java虚拟机:Java虚拟机编译器
  18. Flume-----八种采集方案
  19. 计算机找不到指纹登陆,Win10电脑上登陆选项没有PIN码和指纹设置的解决教程
  20. 云队友丨王兴:九败一胜,百炼成钢

热门文章

  1. mysql 查出数据后插入新建表
  2. C++中在使用自定义类型(结构体类型)的stl数据结构时,operate的用法
  3. LayaAir 文本 Text API 详解
  4. rz安装 xshell_在Linux系统中安装rzsz工具
  5. hdu6715 算术 2019百度之星初赛3-1003
  6. LVM扩容之xfs文件系统
  7. mysql-cluster5.7搭建集群(实际测试有效)
  8. javascript 正则表达式学习
  9. 2018. 2.4 Java中集合嵌套集合的练习
  10. 关于吐槽网播放映兔源视频无法播放的问题 及解决方案