• Python练习-Property的用法


     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的方法
    三次登陆锁定之Property版
     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()
    三次登陆Property功能升级版
  • 相关阅读:
    I Think I Need a Houseboat
    iOS 8 模糊视图(毛玻璃效果)的简单实现UIVisualEffectView
    freemarker报错之二
    [算法]有趣算法合辑[31-40]
    计算机专业术语全称及含义整理
    JAVA经常使用数据结构及原理分析
    我读经典(6):读《文明之光》有感
    流水号的生成(日期+业务码+自增序列)
    桶排序算法
    3.5星|《哈佛商学院最受欢迎的营销课》:跳出营销红海:逆向战略、超越行业和敌意品牌
  • 原文地址:https://www.cnblogs.com/DragonFire/p/6748082.html
Copyright © 2020-2023  润新知