装饰器

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. Mark Down 简单标记语言

    MarkDown介绍=============== ## 1.标题分级介绍 #一级标题###三级标题######六级标题 一级标题============== 二级标题---------------- ...

  2. PHP允许AJAX跨域请求的两种方法

    * 一. 服务端设置 header 头允许AJAX跨域 ** 代码如下: // 允许 ityangs.net 发起的跨域请求 header("Access-Control-Allow-Ori ...

  3. linux磁盘问题排查

    一.ls $>>ls /data* //查看有无input/output error报错 二.demsg $>>demsg|grep sd 问题盘结果: 三.iostat使用 ...

  4. 【Luogu】P3950部落冲突(树链剖分)

    题目链接 状态奇差无比,sbt都能错一遍. 不动笔光想没有想到怎么做,画图之后发现一个很明显的性质…… 那就是两个开战的部落,其中一个是另一个的父亲. 所以在儿子那里加个权值.查询的时候树链剖分查询链 ...

  5. 关于 lambda expression 返回值的类型转换

    lambda expression(lambda 表达式,$\lambda$ 表达式) 是 C++ 11 引入的特性. 一般而言,lambda 表达式的返回值类型可不指定,而由返回值推断. 需要注意的 ...

  6. P1382 楼房 (扫描线,线段树)

    题目描述 地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i]).地平线高度为0.在轮廓 ...

  7. 开源编辑器ueditor

    http://ueditor.baidu.com/website/onlinedemo.html

  8. bzoj 1137 [POI2009]Wsp 岛屿

    题目大意 Byteotia岛屿是一个凸多边形.城市全都在海岸上.按顺时针编号1到n.任意两个城市之间都有一条笔直的道路相连.道路相交处可以自由穿行.有一些道路被游击队控制了,不能走,但是可以经过这条道 ...

  9. bzoj 2799 [Poi2012]Salaries 性质+二分

    题目大意 给出一棵n个结点的有根树,结点用正整数1~n编号. 每个结点有一个1~n的正整数权值,不同结点的权值不相同, 并且一个结点的权值一定比它父结点的权值小(根结点的权值最大,一定是n). 现在有 ...

  10. 同余方程(codevs 1200)

    题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空 ...