1 # 编辑者:闫龙 2 #要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构 3 with open('user.db','w') as write_file:#创建并以写入的方式打开一个文件user.db 4 write_file.write(str({ 5 "egon":{"password":"123",'status':False,'timeout':0}, 6 "alex":{"password":"456",'status':False,'timeout':0}, 7 }))#在user.db中加入两个用户信息以字典的方式储存 8 9 with open('user.db','r') as read_file:#以只读的方式打开一个文件user.db 10 data=read_file.read()#读取user.db中的数据 11 d=eval(data)#将user.db中的数据转为字典 12 print(d['egon']['password'])#打印字典中egon的password 对应value 13 print(d['egon']['status']) 14 print(d['egon']['timeout'])
1 #编辑者:闫龙 2 #要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构 3 class User: #定义User类 4 db_path='user.db' 5 def __init__(self,username): #在实例化User类时,传入Username参数的值 6 self.username=username 7 @property#将db()方法作为属性,让用户调用 8 def db(self): 9 data=open(self.db_path,'r').read()#以只读的方式打开文件user.db 10 return eval(data)#以字典的方式返回user.db中的内容 11 u=User('egon')#实例化对象u,传入egon 12 print(u.db['egon'])#打印又u.db()返回的字典中,对应egon的value 13 print(u.db['egon']['password'])#打印又u.db()返回的字典中,对应egon的password,value
以上两个其实没啥用,重点是在下面
1 #编辑者:闫龙 2 #要求三:分析下述代码的执行流程 3 import time 4 class User:#定义User类 5 db_path='user.db' 6 def __init__(self,name): #在实例化User类时,传入name参数的值 7 self.name=name 8 @property#将db()方法作为属性,让用户调用,同时产生db.setter和db.del方法 9 def db(self): 10 with open(self.db_path,'r') as read_file:#当调用db方法时,打开文件user.db 11 info=read_file.read() 12 return eval(info)#以字典的方式返回user.db中的用户信息 13 @db.setter#在对db属性进行修改操作的时候,调用此方法 14 def db(self,value): 15 with open(self.db_path,'w') as write_file:#创建并打开一个文件user.db 16 write_file.write(str(value))#在文件中写入db属性得到的值 17 write_file.flush()#刷新文件的缓冲区域,让数据立刻写入文件 18 def login(self): #定义login方法 19 data=self.db#data得到db方法(现在被@property修饰过的属性)返回的user.db中的数据 20 if data[self.name]['status']:#判断name的status字段是否为Ture 21 print('已经登录') 22 return True 23 if data[self.name]['timeout'] < time.time(): #判断name的timeout字段值是否小于....呃~1970年到现在的时间 24 count=0 25 while count < 3: 26 passwd=input('password>>: ')#输入密码 27 if not passwd:continue#如果密码为空,那么重新循环到输入密码 28 if passwd == data[self.name]['password']: #输入密码正确 29 data[self.name]['status']=True#更改用户的登陆状态 30 data[self.name]['timeout']=0#超时字段归0 31 self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作 32 break 33 count+=1#只允许用户输入三次错误的机会 34 else: 35 data[self.name]['timeout']=time.time()+10#如果三次输入错误,那么该用户将被锁定10秒 36 self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作 37 else:#如果判断用户的timeout大于1970年到现在的值 38 print('账号已经锁定10秒') 39 40 u1=User('egon') #实例化u1传入name,egon 41 print("egon login:") 42 u1.login()#u1调用login的方法
1 #编辑者:闫龙 2 #要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间 3 import time 4 class User:#定义User类 5 db_path='user.db' 6 def __init__(self,name): #在实例化User类时,传入name参数的值 7 self.name=name 8 print("%s Login:"%self.name) 9 @property#将db()方法作为属性,让用户调用,同时产生db.setter和db.del方法 10 def db(self): 11 with open(self.db_path,'r') as read_file:#当调用db方法时,打开文件user.db 12 info=read_file.read() 13 return eval(info)#以字典的方式返回user.db中的用户信息 14 @db.setter#在对db属性进行修改操作的时候,调用此方法 15 def db(self,value): 16 with open(self.db_path,'w') as write_file:#创建并打开一个文件user.db 17 write_file.write(str(value))#在文件中写入db属性得到的值 18 write_file.flush()#刷新文件的缓冲区域,让数据立刻写入文件 19 @property 20 def UserLockTime(self): 21 return int(self.db[self.name]["timeout"]-time.time()) 22 def loginOut(self): 23 data = self.db 24 if(data[self.name]['status']): 25 print(self.name, "正在登出.....") 26 data[self.name]['status'] = False 27 self.db = data 28 time.sleep(2) 29 print(self.name,"登出成功!") 30 else: 31 print(self.name,"并没有登陆") 32 def login(self): #定义login方法 33 data=self.db#data得到db方法(现在被@property修饰过的属性)返回的user.db中的数据 34 if data[self.name]['status']:#判断name的status字段是否为Ture 35 print('已经登录') 36 return True 37 if data[self.name]['timeout'] < time.time(): #判断name的timeout字段值是否小于....呃~1970年到现在的时间 38 count=0 39 while count < 3: 40 passwd=input('password>>: ')#输入密码 41 if not passwd:continue#如果密码为空,那么重新循环到输入密码 42 if passwd == data[self.name]['password']: #输入密码正确 43 data[self.name]['status']=True#更改用户的登陆状态 44 data[self.name]['timeout']=0#超时字段归0 45 self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作 46 print("欢迎%s登陆,马上为您进行登出服务"%self.name) 47 time.sleep(3) 48 break 49 count+=1#只允许用户输入三次错误的机会 50 else: 51 data[self.name]['timeout']=time.time()+180#如果三次输入错误,那么该用户将被锁定180秒 52 self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作 53 else:#如果判断用户的timeout大于1970年到现在的值 54 print('账号已经锁定180秒,剩余%s秒'%self.UserLockTime) 55 u1=User('egon') #实例化u1传入name,egon 56 u1.login()#u1调用login的方法 57 u1.loginOut()#u1调用loginOut方法 58 u2=User('alex') 59 u2.login()