作业一:总结
1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
定义:只要是在类内部定义的,并且没有被任何装饰器修饰过的方法,都是绑定到对象的
调用:对象.对象的绑定方法(),不用为self传值
特性:绑定方法唯一绑定一个对象,obj.func()会把obj传给func的第一个参数。
2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
定义:在类内部定义的,并且被装饰器@classmethod修饰过的方法,都是绑定到类的
调用:类.方法名()
特性:调用时会把对象本身当做第一个参数传给对象的绑定方法
3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
定义:既不与类绑定,也不与对象绑定,不与任何事物绑定
调用:类名.函数()
特性:都没有自动传值
4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
定义:property
可以作为一个装饰器用来封装对象的数据属性和类的函数属性
使用:@
property
情况:类的函数名是名词的时候和不想让外部直接操作我的对象的时候
好处:对象在使用被装饰的方法时,不用管运行的逻辑,只要通过接口调用就好了
作业二:
要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构
1 with open(‘user.db‘,‘w‘) as write_file: 2 3 write_file.write(str({ 4 5 "egon":{"password":"123",‘status‘:False,‘timeout‘:0}, 6 "alex":{"password":"456",‘status‘:False,‘timeout‘:0}, 7 }))#加入两个用户的详细信息,以字典形式储存 8 9 with open(‘user.db‘,‘r‘) as read_file: 10 data=read_file.read() 11 d=eval(data)#转化为字典 12 print(d[‘egon‘][‘password‘]) 13 print(d[‘egon‘][‘status‘]) 14 print(d[‘egon‘][‘timeout‘])
要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构
1 class User: 2 db_path=‘user.db‘ 3 def __init__(self,username): 4 self.username=username 5 @property 6 def db(self): 7 data=open(self.db_path,‘r‘).read() 8 return eval(data) 9 10 u=User(‘egon‘) 11 print(u.db[‘egon‘]) 12 print(u.db[‘egon‘][‘password‘])
要求三:分析下述代码的执行流程
1 class User: 2 db_path=‘user.db‘ 3 def __init__(self,name):#实列化 4 self.name=name 5 @property 6 def db(self): 7 with open(self.db_path,‘r‘) as read_file: 8 info=read_file.read() 9 return eval(info) 10 @db.setter 11 def db(self,value): 12 with open(self.db_path,‘w‘) as write_file: 13 write_file.write(str(value)) 14 write_file.flush() 15 16 def login(self): 17 data=self.db 18 if data[self.name][‘status‘]: 19 print(‘已经登录‘) 20 return True 21 if data[self.name][‘timeout‘] < time.time(): 22 count=0 23 while count < 3: 24 passwd=input(‘password>>: ‘) 25 if not passwd:continue 26 if passwd == data[self.name][‘password‘]: 27 data[self.name][‘status‘]=True 28 data[self.name][‘timeout‘]=0 29 self.db=data 30 break 31 count+=1 32 else: 33 data[self.name][‘timeout‘]=time.time()+10 34 self.db=data 35 else: 36 print(‘账号已经锁定10秒‘) 37 38 u1=User(‘egon‘) 39 u1.login() 40 41 u2=User(‘alex‘) 42 u2.login()1.
用户实例化
2.
用户登录,先到@
property
下定义的函数中找文件,以字典的形式返回
3.
判断如果用户的状态是
True
,返回
"已经登陆"
4.
如果没有登录,判断用户的时间是否小于当前的时间戳
如果小于
判断是否错误登录大于三次
如果小于
用户输入密码,错误一次继续输入,三次后锁定
如果密码正确,把状态改为
True
,时间为
0
,执行@db.setter下的代码,把数据重新写入原来的文件
如果大于
输出账号已经锁定
10
秒
要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间