# 编辑者:闫龙
#要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用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. [转帖] JVM虚拟机的历史

    Java虚拟机发展史 https://blog.csdn.net/tinyDolphin/article/details/72809018 如何查看自己的虚拟机版本?Sun Classic / Exa ...

  2. js遍历数组和遍历对象

    可以用for in来遍历对象,具体内容如下: <script type="text/javascript">             var objs = {      ...

  3. 第212天:15种CSS居中的方式,最全了

    CSS居中是前端工程师经常要面对的问题,也是基本技能之一.今天有时间把CSS居中的方案整理了一下,目前包括水平居中,垂直居中及水平垂直居中方案共15种.如有漏掉的,还会陆续的补充进来,算做是一个备忘录 ...

  4. CentOS6.7的安装

    VMware9的安装请阅读:  http://www.cnblogs.com/duanji/p/yueding.html CentOS6.7在VMware9中安装 1.启动VMware的画面 2.点击 ...

  5. 再谈MySql索引

    一.索引简介 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引(主键索引.唯一索引.普通索引)和组合索引.单列索引,即一个索引只包含单个列 ...

  6. 【刷题】洛谷 P1402 酒店之王

    题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...

  7. BZOJ 3881: [Coci2015]Divljak

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 553  Solved: 176[Submit][Sta ...

  8. BZOJ 2938: [Poi2000]病毒

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 360[Submit][Status][Di ...

  9. Java之初学异常

    异常 学习异常的笔记记录 异常 异常的概念 指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止. 异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行. ...

  10. [Codeforces Gym] 100162B Circle of Stones

    题意: 桌子上有 n 个石头围成一个环.每个石头都有一种颜色.每种颜色可以由小写英文字母表示.如果每一对相邻的石头都是不同颜色的,则称这 n 个石头构成的环是美丽的.现在,你可以从这 n 个石头中拿走 ...