装饰器

1.无参数

2.函数有参数

3.函数动态参数

4.装饰器参数

装饰器的应用

下面题目同http://www.cnblogs.com/xuyaping/p/6679305.html,只不过加了装饰器统计时间和认证功能。
 
1、定义无参装饰器为被装饰器添加统计运行时间的功能
#定义闭包无参函数,为程序增加统计时间功能
import time
def timer(func): #定义timer函数,func变量值为login
def wrapper():
start_time=time.time() #设置函数起始时间
func() #函数名加()调用函数,即调用login(),然后调用结束后继续在wrapper函数中运行
stop_time=time.time()
print("run time is %s"%(stop_time-start_time))
return wrapper #返回wrapper函数名,然后再次进入wrapper函数 @timer #相当于timer(login)-->赋值给timer函数名
def login():
#读取注册用户的信息,用户名,密码,输错次数,写入字典中
user={}
with open("DB1",encoding="utf8") as f:
for line in f:
username_list=line.strip().split("|") #username_list--->['egon', '123', '2']
user[username_list[0]]={"name":username_list[0],
"pwd":username_list[1],
"times":username_list[2]}
# print(user) #-->{'egon': {'name': 'egon', 'pwd': '123', 'times': '2'}, 'xuyaping': {'name': 'xuyaping', 'pwd': '123', 'times': '0'}, 'xyy': {'name': 'xyy', 'pwd': '123', 'times': '1'}} #读取黑名单用户,将黑名单用户加入列表中
with open("black_lockname",encoding="utf8") as f1:
black_list=[]
for line in f1:
black_list.append(line.strip())
# print(black_list) while True:
username = input("please input your username:").strip()
passwd = input("please input your passwd:").strip()
#用户在黑名单中
if username in black_list:
print("该用户为黑名单用户,请滚")
break # 用户为注册用户
elif username in user:
user[username]["times"]=int(user[username]["times"])
if user[username]["times"]<3 and passwd==user[username]["pwd"]:
print("登录成功")
user[username]["times"]=0
#将修改后的信息重新写入DB1中
with open("DB1","w",encoding="utf8") as f3:
for i in user:
f3.write(i + "|" + user[i]["pwd"] + "|" + str(user[i]["times"]) + "\n")
break else:
user[username]["times"]+=1
print("登录错误")
# 将修改后的信息重新写入DB1中
with open("DB1", "w", encoding="utf8") as f3:
for i in user:
f3.write(i + "|" + user[i]["pwd"] + "|" + str(user[i]["times"]) + "\n")
if user[username]["times"]==3:
black_list.append(username)
print("账户被锁定")
# 将修改后的信息重新写入black_lockname中
with open("black_lockname","w",encoding="utf8") as f4:
for j in black_list:
f4.write(j+ "\n")
break #用户不是注册用户
else:
print("该用户没有注册")
break login()

  

 
2、定义有参装饰器为被装饰器添加认证功能:用户的信息可以来源于file也可以是ldap,三次验证失败锁定用户

#定义闭包有参函数,为程序增加验证功能
def auth2(auth_type):
def auth(func): #func参数此时被赋值为login
def wragger(*args,**kwargs): #wragger函数携带变量auth_type的值
if auth_type=="file":
func() #运行函数login
elif auth_type=="ldap":
print("你他妈还想不想玩了?") return wragger
return auth @auth2(auth_type="file") #相当于运行函数auth2(file),返回auth,auth(login)赋值给login函数名
def login():
#读取注册用户的信息,用户名,密码,输错次数,写入字典中
user={}
with open("DB1",encoding="utf8") as f:
for line in f:
username_list=line.strip().split("|") #username_list--->['egon', '123', '2']
user[username_list[0]]={"name":username_list[0],
"pwd":username_list[1],
"times":username_list[2]}
# print(user) #-->{'egon': {'name': 'egon', 'pwd': '123', 'times': '2'}, 'xuyaping': {'name': 'xuyaping', 'pwd': '123', 'times': '0'}, 'xyy': {'name': 'xyy', 'pwd': '123', 'times': '1'}} #读取黑名单用户,将黑名单用户加入列表中
with open("black_lockname",encoding="utf8") as f1:
black_list=[]
for line in f1:
black_list.append(line.strip())
# print(black_list) while True:
username = input("please input your username:").strip()
passwd = input("please input your passwd:").strip()
#用户在黑名单中
if username in black_list:
print("该用户为黑名单用户,请滚")
break # 用户为注册用户
elif username in user:
user[username]["times"]=int(user[username]["times"])
if user[username]["times"]<3 and passwd==user[username]["pwd"]:
print("登录成功")
user[username]["times"]=0
#将修改后的信息重新写入DB1中
with open("DB1","w",encoding="utf8") as f3:
for i in user:
f3.write(i + "|" + user[i]["pwd"] + "|" + str(user[i]["times"]) + "\n")
break else:
user[username]["times"]+=1
print("登录错误")
# 将修改后的信息重新写入DB1中
with open("DB1", "w", encoding="utf8") as f3:
for i in user:
f3.write(i + "|" + user[i]["pwd"] + "|" + str(user[i]["times"]) + "\n")
if user[username]["times"]==3:
black_list.append(username)
print("账户被锁定")
# 将修改后的信息重新写入black_lockname中
with open("black_lockname","w",encoding="utf8") as f4:
for j in black_list:
f4.write(j+ "\n")
break #用户不是注册用户
else:
print("该用户没有注册")
break login()

  

  

python(15)- 装饰器及装饰器的使用的更多相关文章

  1. python 15 带参装饰器

    目录 2. 带参数的装饰器 3. 多个装饰器装饰一个函数 2. 带参数的装饰器 #在装饰器的基础上再套一层 def auth(argv): def wrapper(func): def inner(* ...

  2. python中函数总结之装饰器闭包

    1.前言 函数也是一个对象,从而可以增加属性,使用句点来表示属性. 如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包. 2.装饰器 装饰器 ...

  3. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

  4. Python 函数修饰符(装饰器)的使用

     Python 函数修饰符(装饰器)的使用 1.  修饰符的来源修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 修饰符是解决这类问题的绝佳设计, ...

  5. Python基础(八)装饰器

    今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...

  6. Python - 三大器 迭代器,生层器,装饰器

    目录 Python - 三大器 迭代器,生层器,装饰器 一. 容器 二. 可迭代对象(iterable) 三. 迭代器 四. 生成器 五. 装饰器 1. 定义 六. 闭包 Python - 三大器 迭 ...

  7. python高级 之(二) --- 类装饰器

    装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...

  8. Python 学习笔记9(装饰器,decorator)

    31 装饰器 装饰器可以对一个函数.方法或者类进行加工,是一种高级的python语法. 装饰函数 接收一个可调用对象作为输入参数,并返回一个新的可调用对象. 把函数传递给装饰器,然后增加新的功能,返回 ...

  9. Python成长之路_装饰器

    一.初入装饰器 1.首先呢我们有这么一段代码,这段代码假设是N个业务部门的函数 def f1(aaa): print('我是F1业务') if aaa == 'f1': return 'ok' def ...

随机推荐

  1. Django模板(filter过滤器{{ }}与tag标签{% %}应用)

     模板里面过滤器与标签的应用 templates模板里面的应用参考(主要应用在这里面) <!DOCTYPE html> <html lang="en"> & ...

  2. 基于UDP的交互的实例

    1.实现简单的客户端.服务端聊天交互 问题是:客户端不能单独一直发消息回复.. 服务端: import socket server=socket.socket(socket.AF_INET,socke ...

  3. 2017"百度之星"程序设计大赛 - 复赛

    Arithmetic of Bomb  Accepts: 1050  Submissions: 1762  Time Limit: 2000/1000 MS (Java/Others)  Memory ...

  4. [LOJ#6002]「网络流 24 题」最小路径覆盖

    [LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是  ...

  5. 如何在 Windows 上 使用 ONLYOFFICE 协作编辑文档

    ONLYOFFICE Document Server提供文档协作的服务功能,支持Word,Excel和PowerPoint的协作.但是这里告诉我们,需要进行文档管理和存储的二次开发. Please n ...

  6. 计算机、程序和java概述

    1.1 计算机.程序和java概述计算机包括硬件(hardware)软件(software)两部分.硬件包括计算机中看得见的物理部分,软件提供看不见的指令,指令控制硬件并且使得硬件完成特定的任务.一台 ...

  7. 刷题总结——树有几多愁(51nod1673 虚树+状压dp+贪心)

    题目: lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输 ...

  8. cf671B Robin Hood

    We all know the impressive story of Robin Hood. Robin Hood uses his archery skills and his wits to s ...

  9. java string中indexOf()常用用法

    Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String st ...

  10. 搭建redis集群时所遇问题及解决方法

    单独一台虚拟机(系统CentOS 7) 问题1 创建redis集群环境时,输入以下命令 [root@localhost redis-cluster]# ./redis-trib.rb create - ...