# 编辑者:闫龙
#要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用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. linux使用密文生成os账户

    1.生成账户 [hufangrui@xxx ~]$ openssl passwd -1Password: Verifying - Password: $1$szzkROBZ$GYxffRLp8K5vW ...

  2. Class.getResourceAsStream 和 ClassLoder.getResourceAsStream 的区别

    问题描述 最近学习MyBaits时用到了 InputStream Resources.getResourceAsStream(String resource)来读取MyBatis配置文件,为了方便使用 ...

  3. todomvc-app

    1.HTML <!doctype html> <html lang="en"> <head> <meta charset="ut ...

  4. java 面试随笔

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

  5. System Board Replacement Notice

    System Board Replacement Notice System Board Replacement Notice for TP 770E and TP 600 Restoring the ...

  6. 【刷题】HDU 6183 Color it

    Problem Description Do you like painting? Little D doesn't like painting, especially messy color pai ...

  7. 【JQuery】Ajax

    一.前言        接着上一章的内容,继续本章的学习.本章知识来自于https://www.cnblogs.com/jach/p/5709175.html 二.内容 $.ajax({ url:'/ ...

  8. 【BZOJ1054】移动玩具(搜索)

    [BZOJ1054]移动玩具(搜索) 题面 BZOJ 洛谷 题解 这种小清新搜索题写出来好舒服啊. 要是原来的我来写代码肯定又臭又长吧.. #include<cstdio> #includ ...

  9. Timus 1005 解题报告

    题目链接 http://acm.timus.ru/problem.aspx?space=1&num=1005 题目大意 给你一堆石头,现在需要你将这堆石头分成两堆,要求两堆石头的重量相差最小, ...

  10. 【BZOJ3518】点组计数

    Description 平面上摆放着一个\(n*m\)的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c是不同的3个点,其顺序 ...