# 编辑者:闫龙
#要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构
with open('user.db','w') as write_file:#创建并以写入的方式打开一个文件user.db
write_file.write(str({
"egon":{"password":"",'status':False,'timeout':0},
"alex":{"password":"",'status':False,'timeout':0},
}))#在user.db中加入两个用户信息以字典的方式储存 with open('user.db','r') as read_file:#以只读的方式打开一个文件user.db
data=read_file.read()#读取user.db中的数据
d=eval(data)#将user.db中的数据转为字典
print(d['egon']['password'])#打印字典中egon的password 对应value
print(d['egon']['status'])
print(d['egon']['timeout'])

定义文件结构

 #编辑者:闫龙
#要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构
class User: #定义User类
db_path='user.db'
def __init__(self,username): #在实例化User类时,传入Username参数的值
self.username=username
@property#将db()方法作为属性,让用户调用
def db(self):
data=open(self.db_path,'r').read()#以只读的方式打开文件user.db
return eval(data)#以字典的方式返回user.db中的内容
u=User('egon')#实例化对象u,传入egon
print(u.db['egon'])#打印又u.db()返回的字典中,对应egon的value
print(u.db['egon']['password'])#打印又u.db()返回的字典中,对应egon的password,value

获取用户信息

以上两个其实没啥用,重点是在下面

 #编辑者:闫龙
#要求三:分析下述代码的执行流程
import time
class User:#定义User类
db_path='user.db'
def __init__(self,name): #在实例化User类时,传入name参数的值
self.name=name
@property#将db()方法作为属性,让用户调用,同时产生db.setter和db.del方法
def db(self):
with open(self.db_path,'r') as read_file:#当调用db方法时,打开文件user.db
info=read_file.read()
return eval(info)#以字典的方式返回user.db中的用户信息
@db.setter#在对db属性进行修改操作的时候,调用此方法
def db(self,value):
with open(self.db_path,'w') as write_file:#创建并打开一个文件user.db
write_file.write(str(value))#在文件中写入db属性得到的值
write_file.flush()#刷新文件的缓冲区域,让数据立刻写入文件
def login(self): #定义login方法
data=self.db#data得到db方法(现在被@property修饰过的属性)返回的user.db中的数据
if data[self.name]['status']:#判断name的status字段是否为Ture
print('已经登录')
return True
if data[self.name]['timeout'] < time.time(): #判断name的timeout字段值是否小于....呃~1970年到现在的时间
count=0
while count < 3:
passwd=input('password>>: ')#输入密码
if not passwd:continue#如果密码为空,那么重新循环到输入密码
if passwd == data[self.name]['password']: #输入密码正确
data[self.name]['status']=True#更改用户的登陆状态
data[self.name]['timeout']=0#超时字段归0
self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作
break
count+=1#只允许用户输入三次错误的机会
else:
data[self.name]['timeout']=time.time()+10#如果三次输入错误,那么该用户将被锁定10秒
self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作
else:#如果判断用户的timeout大于1970年到现在的值
print('账号已经锁定10秒') u1=User('egon') #实例化u1传入name,egon
print("egon login:")
u1.login()#u1调用login的方法

三次登陆锁定之Property版

 #编辑者:闫龙
#要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间
import time
class User:#定义User类
db_path='user.db'
def __init__(self,name): #在实例化User类时,传入name参数的值
self.name=name
print("%s Login:"%self.name)
@property#将db()方法作为属性,让用户调用,同时产生db.setter和db.del方法
def db(self):
with open(self.db_path,'r') as read_file:#当调用db方法时,打开文件user.db
info=read_file.read()
return eval(info)#以字典的方式返回user.db中的用户信息
@db.setter#在对db属性进行修改操作的时候,调用此方法
def db(self,value):
with open(self.db_path,'w') as write_file:#创建并打开一个文件user.db
write_file.write(str(value))#在文件中写入db属性得到的值
write_file.flush()#刷新文件的缓冲区域,让数据立刻写入文件
@property
def UserLockTime(self):
return int(self.db[self.name]["timeout"]-time.time())
def loginOut(self):
data = self.db
if(data[self.name]['status']):
print(self.name, "正在登出.....")
data[self.name]['status'] = False
self.db = data
time.sleep(2)
print(self.name,"登出成功!")
else:
print(self.name,"并没有登陆")
def login(self): #定义login方法
data=self.db#data得到db方法(现在被@property修饰过的属性)返回的user.db中的数据
if data[self.name]['status']:#判断name的status字段是否为Ture
print('已经登录')
return True
if data[self.name]['timeout'] < time.time(): #判断name的timeout字段值是否小于....呃~1970年到现在的时间
count=0
while count < 3:
passwd=input('password>>: ')#输入密码
if not passwd:continue#如果密码为空,那么重新循环到输入密码
if passwd == data[self.name]['password']: #输入密码正确
data[self.name]['status']=True#更改用户的登陆状态
data[self.name]['timeout']=0#超时字段归0
self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作
print("欢迎%s登陆,马上为您进行登出服务"%self.name)
time.sleep(3)
break
count+=1#只允许用户输入三次错误的机会
else:
data[self.name]['timeout']=time.time()+180#如果三次输入错误,那么该用户将被锁定180秒
self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作
else:#如果判断用户的timeout大于1970年到现在的值
print('账号已经锁定180秒,剩余%s秒'%self.UserLockTime)
u1=User('egon') #实例化u1传入name,egon
u1.login()#u1调用login的方法
u1.loginOut()#u1调用loginOut方法
u2=User('alex')
u2.login()

三次登陆Property功能升级版

Python练习-Property的用法的更多相关文章

  1. Python 中@property的用法

    在绑定属性时,如果我们直接把属性赋值给对象,比如: p = Person() p.name= 'Mary' 我们先看个详细的例子(注意双下划线name和age定义为私有变量): class Perso ...

  2. 10 python 封装----@property的用法

    1.基本概念 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A ...

  3. 【Python】@property的用法

    设想我们要给一个student()类的一个实例s,添加一个score的属性,比如: s.score=999999 这个值明显是不合理的,但是它却是可行的,怎么能改变这种情况?我们能想到的就是用类方法 ...

  4. python的property的用法

    假设定义了一个类:C,该类必须继承自object类,有一私有变量_xclass C: def __init__(self): self.__x=None 1.现在介绍第一种使用属性的方法: 在该类中定 ...

  5. python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)

    一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...

  6. Python的property装饰器的基本用法

    Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...

  7. 聊聊属性方法property的用法

    写之前随便百度了一下博客,又看到廖雪峰的博客了.果然置顶的能力很强. 我想说其实property的用法并不是主要用来做类型检查.反而更多应该是用于简化操作的目的. 写之前想聊一个古老的话题.年初的时候 ...

  8. python特性--property

    在定义一个类的时候,有时我们需要获取一个类的属性值,而这个属性值需要经过类中的其他属性运算来获得的.那么很容易,只要我们在类中定义一个方法,并且通过调用方法可以获取到那个需要运算的属性值.那么,问题来 ...

  9. python中property属性的介绍及其应用

    Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的 ...

随机推荐

  1. vue 组件 模板input双向数据数据

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>T ...

  2. Dubbo学习(一) Dubbo原理浅析

    一.初入Dubbo Dubbo学习文档: http://dubbo.incubator.apache.org/books/dubbo-user-book/ http://dubbo.incubator ...

  3. ajax异步请求loading

    1.找到一张loading图片 2.添加样式 <style> .loadingWrap{ position:fixed; top:; left:; width:100%; height:1 ...

  4. Redis 基础:Redis 数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  5. java 面试随笔

    ---恢复内容开始--- 1.自我介绍 2.你在项目开发过程中遇到的那些问题! 3.懂bootstrap么?简单介绍一下 4.spring的会话数据是怎样的. 5.为什么会有session 因为htt ...

  6. 【uoj219】 NOI2016—优秀的拆分

    http://uoj.ac/problem/219 (题目链接) 题意 一个字符串求它有多少个形如AABB的子串. Solution 其实跟后缀数组里面一个论文题poj3693处理方式差不多吧. 先处 ...

  7. Android studio gradle配置完整版(转)

    Android studio gradle配置完整版https://my.oschina.net/u/1471093/blog/539075 Android studio 自定义打包apk名 - pe ...

  8. 解题:USACO14MAR Counting Friends

    题面 枚举每个数字是否能被删去,然后就是如何判定图是否存在.应该从按“度数”从大到小排序,从最大的顺次向其他点连边(先连“度数”小的可能会把一些可以和大“度数”点连接的点用掉).但是这个排序每连一次都 ...

  9. bzoj2758【scoi2012】Blinker的的噩梦

    题目描述 一天Blinker醒来,发现自己成为了一个二维世界的点,而且被标记上了一个奇怪的值. 这个世界是由N个边界互不相交(且不相切)的图形组成,这里图形仅包括圆和凸多边形.每个图形还有一个权值.每 ...

  10. cloudera manager安装hive注意事项,提示连不上数据库,没有user目录权限

    1.提示连不上数据库,password:null 解决方法:拷贝数据库驱动到hive的lib目录,数据库要使用安装hive机器的本地数据库,远程的可能连不上 2.没有/user目录权限 解决方法:因为 ...