# 编辑者:闫龙
#要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用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. 面试问题总结二(技术能力-PHP)----Ⅲ

    42.什么是单点登录? 答:单点登录 SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信 ...

  2. Android bp语法介绍

    参考网址: http://note.qidong.name/demo/soong_build/ 谷歌官网文档: https://android.googlesource.com/platform/bu ...

  3. ACM数论之旅8---组合数(组合大法好(,,• ₃ •,,) )

    组合数并不陌生(´・ω・`) 我们都学过组合数 会求组合数吗 一般我们用杨辉三角性质 杨辉三角上的每一个数字都等于它的左上方和右上方的和(除了边界) 第n行,第m个就是,就是C(n, m) (从0开始 ...

  4. eclipse 导入 gradle 项目遇到 UnsupportedConfigurationException 异常

    异常描述: org.eclipse.buildship.core.UnsupportedConfigurationException: Project at 'D:\XXXX_workspace\XX ...

  5. java 数字转中文

    java代码 数字转中文,该方法只做了对int型整数的转换 private static String numberToChinese(int number) { String[] numbers = ...

  6. java 静态方法 java 类中的方法无论静态还是非静态的都可以使用静态变量 而静态方法只能使用静态变量 (因为对象还没创建 所以不能在静态方法里面用this)

  7. False Ordering LightOJ - 1109(暴力。。唉,。又是一个水题。。)

    We define b is a Divisor of a number a if a is divisible by b. So, the divisors of 12 are 1, 2, 3, 4 ...

  8. [LOJ2271] [SDOI2017] 遗忘的集合

    题目链接 LOJ:https://loj.ac/problem/2271 洛谷:https://www.luogu.org/problemnew/show/P3784 BZOJ太伤身体死活卡不过还是算 ...

  9. yum报错Segmentation fault

    yum install 安装一个包,提示 Segmentation fault,可以确定的是这个源肯定是可用的. 经查询,是 libz 这个库存在多个版本,导致冲突. # ldconfig -v | ...

  10. 构建工具-----Gradle-----安装配置

    介绍 Gradle 是一款构建工具,继 Ant .Maven 之后的现代构建工具. 下载 Gradle 下面是 Gradle 的官方网站地址: Gradle l Modern Open-Source ...