作业一:总结
1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
定义:类的函数中没有被装饰器装饰过的函数就是绑定到类实例化出的对象方法 调用:实例名.函数名(),参数除了self其余都传,绑定方法就是给对象用的 特性:绑定方法的作用对象唯一 对象调用绑定方法时会自动把对象作为第一个参数传进去
2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
定义:在定义类的函数时先加一个装饰器@classmethod,然后再在装饰器的正下方定义要绑定到类的方法,第一个参数默认为cls 调用:类.方法名(),类的绑定方法就是给类用的,包括该类和他的子类,但是对象要用也可以 特性:该类和他的子类中谁调用这个方法参数中的cls就自动传谁 谁的实例去调用这个方法参数中的cls就自动传谁
3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
定义:在定义类的函数时先加一个装饰器@staticmethod,然后再在装饰器的正下方定义要解除绑定的方法 调用:类名.函数(),是给类的用的,但是对象要用也可以 特性:函数中没有自动传值了,缺几个参数就需要传几个参数
4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
定义:property可以作为一个装饰器用来封装对象的数据属性和类的函数属性 使用:@property,给类用 类的函数名是名词的时候和不想让外部直接操作我的对象的时候 对象在使用被装饰的方法时,不用管运行的逻辑,只要通过接口调用就好了
作业二:
要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构
with open('user.db','w') as write_file: write_file.write(str({ "egon":{"password":"123",'status':False,'timeout':0}, "alex":{"password":"456",'status':False,'timeout':0}, })) with open('user.db','r') as read_file: data=read_file.read() d=eval(data) print(d['egon']['password']) print(d['egon']['status']) print(d['egon']['timeout'])
要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构
class User: db_path='user.db' def __init__(self,username): self.username=username @property def db(self): data=open(self.db_path,'r').read() return eval(data) u=User('egon') print(u.db['egon']) print(u.db['egon']['password'])
要求三:分析下述代码的执行流程
import time class User: db_path='user.db' def __init__(self,name): self.name=name @property def db(self): with open(self.db_path,'r') as read_file: info=read_file.read() return eval(info) @db.setter def db(self,value): with open(self.db_path,'w') as write_file: write_file.write(str(value)) write_file.flush() def login(self): data=self.db if data[self.name]['status']: print('已经登录') return True if data[self.name]['timeout'] < time.time(): 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 self.db=data break count+=1 else: data[self.name]['timeout']=time.time()+10 self.db=data else: print('账号已经锁定10秒') u1=User('egon') u1.login() u2=User('alex') u2.login()
1.用户实例化 2.用户登录,先去@property下定义的函数中找文件,以字典的形式返回 3.判断如果用户的状态是True,返回"已经登陆" 4.如果没有登录,判断用户的时间是否小于当前的时间戳 如果小于 判断是否大于错误登录三次 如果小于 用户输入密码,错误一次继续输入,三次后锁定 如果密码正确,把状态改为True,时间为0,执行@db.setter下的代码,把数据重新写入原来的文件 如果大于 输出账号已经锁定10秒
要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间
import time class User: db_path='user.db' def __init__(self,name): self.name=name @property def db(self): with open(self.db_path,'r') as read_file: info=read_file.read() return eval(info) @db.setter def db(self,value): with open(self.db_path,'w') as write_file: write_file.write(str(value)) write_file.flush() @property def timeout(self): data = self.db if data[self.name]['timeout'] > time.time(): print('锁定还剩%s秒' %(data[self.name]['timeout']-time.time())) else: print('账户未锁定') def login(self): data=self.db if data[self.name]['status']: print('已经登录') return True if data[self.name]['timeout'] < time.time(): 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 self.db=data break count+=1 else: data[self.name]['timeout']=time.time()+10 self.db=data else: print('账号已经锁定10秒') def logout(self): data=self.db if data[self.name]['status'] == False: print('你现在是退出状态') return False else: data[self.name]['status'] = False data[self.name]['timeout'] = 0 self.db = data print("账户已经退出") u1=User('egon') u1.logout() u1.timeout