一:总结
1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
只要是在类内部定义的,并且没有被任何装饰器修饰过的方法,都是绑定到对象的
绑定到对象,指的是:就给对象去用,
使用方式:对象.对象的绑定方法(),不用为self传值
特性:调用时会把对象本身当做第一个参数传给对象的绑定方法
2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
在类内部定义的,并且被装饰器@classmethod修饰过的方法,都是绑定到类的
绑定到对象,指的是:就给对象去用,
使用方式:对象.对象的绑定方法()
特性:调用时会把对象本身当做第一个参数传给对象的绑定方法
3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
既不与类绑定,也不与对象绑定,不与任何事物绑定
绑定的特性:自动传值(绑定到类的就是自动传类,绑定到对象的就自动传对象)
解除绑定的特性:不管是类还是对象来调用,都没有自动传值这么一说了
staticmethod就是相当于一个普通的工具包
4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值。
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,
这种特性的使用方式遵循了统一访问的原则
二:
要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用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'])
往user.db文件写入并执行结果就是分别取到egon为key的value中的各个key的值
要求二:定义用户类,定义属性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'])
首先实例化一个对象u,传入egon参数执行property装饰过的函数,user.db中取值,取出字典中key为egon的value,
然后打印出来。继续会执行上步同样操作,会在以key为egon的value中{"password":"123",'status':False,'timeout':0}
取出key为password的值,然后打印出来("123")
要求三:分析下述代码的执行流程
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 #@property装饰下的db函数,读取出user.db的文件内容,赋值给info if data[self.name]['status']: #对data字典中egon的key值下的status的key值进行判断, print('已经登录') #如果值为True,直接打印‘已经登录’如果值为Flase,进行if 判断 return True if data[self.name]['timeout'] < time.time(): #如果data[self.name]['timeout']<time.time(),进入while循环 count=0 while count < 3: passwd=input('password>>: ') if not passwd:continue if passwd == data[self.name]['password']: #输入passwd,进行判断:如果输入为空,继续循环 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() #执行def login(self)函数 u2=User('alex') u2.login()
要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),
自定义property,供用户查看自己账号的锁定时间
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): import time 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 quit(self): # 用来退出登录 data = self.db if data[self.name]['status']: data[self.name]['status'] = False data[self.name]['timeout'] = 0 self.db = data else: print("未登录账户无法退出") @property # 查看账户锁定时间 def timeout(self): with open(self.db_path, 'r') as read_file_1: info1 = eval(read_file_1.read()) time_out = info1[self.name]['timeout'] print(time_out) u1 = User('egon') u1.login() u1.quit() u1.timeout u2 = User('alex') u2.login() u2.quit()