作业一:总结
1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
(1)定义在类中的没有被任何装饰器修饰过的数据属性和函数属性,当类实例化对象后,那么这些类的属性都能通过(对象.方法)的方式
调用,这些方法就是绑定到对象身上的方法。
(2)定义就是类的这些方法在定义时就是绑定到所有即将实例化的对象身上的,没有实例对象就没有这种绑定方法,
当实例对象产生时,这种绑定关系就会自动建立,对象产生后就能自动调用类的这些方法。
(3)使用方法:对象.类中定义的函数名字(),它是给这个类产生的对象本身用的。
(4)特性:对象调用时不用传第一个参数,调用时绑定方法会自动将对象本身当作第一个参数传进去,
所以哪个对象调用就会传哪个对象,对象之间互不冲突。
2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
(1)类的的函数属性,且被装饰器@classmethod修饰过,那么这个函数属性就是绑定到类的方法,此时它就不是绑定到对象的方法了。
(2)当一个类调用这种被装饰器@classmethod修饰过的函数属性时,classmethod就会把这个类本身当作第一个参数传到被装饰
的函数里,那么这个函数属性就是绑定到这个类的绑定方法。
(3)调用方法:把一个方法绑定给类:类.绑定到类的方法(),哪个类调用就会给哪个类用。
(4)特性:当一个类调用时会把这个类本身当做第一个参数自动传给绑定到类的方法
3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
(1)当类的绑定函数被staticmethod装饰过后就会解除这种绑定关系,它既不与类绑定,也不与对象绑定,不与任何事物绑定
(2)但凡是定义在类的内部,并且被staticmethod装饰器修饰过的方法,都是解除绑定的方法函数,
实际上就变成了在类内部定义的普通函数:所以它也就没有自动传值功能了
(3)类.这个被装饰过的函数(),对象.这个被装饰过的函数()
它相当于类的的工具包,其实是给类使用的,但是对象调用的效果也是一样的。
(4)特性:不管是类还是对象来调用,都没有自动传值功能。
4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
(1)property其实就是把用户真正想操作的数据转移到了被property装饰过的函数里。
(2)是一种特殊的属性,访问它时,它会先执行一段函数运算并返回一个值。
它实际上是定义类的时候给这个类内部使用的。
(3)调用方法其实就跟对象调用绑定方法一样,只是实际的执行过程被封装起来了(隐藏成一个函数的执行),它依然是给类的对象使用的。
(4)将一个类的函数定义成特性以后,对象再去使用绑定方法时,根本无法察觉自己是执行了一个函数然后得到自己想要的结果,这种特性的使用方式遵循了统一访问的原则
好处:封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑
作业二:
要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构
with open('user.db','w') as write_file:#以写操作的方式打开use.db文件
write_file.write(str({
"egon":{"password":"123",'status':False,'timeout':0},
"alex":{"password":"456",'status':False,'timeout':0},
})) #在user.db文件中写入两组字典结构形式的数据
with open('user.db','r') as read_file:#以只读方式打开刚才的文件
data=read_file.read() #读取文件内容
d=eval(data) #转化成字典结构形式
print(d['egon']['password'])#打印字典中key为egon的value值中字典的key为password对应的value值
print(d['egon']['status'])#打印字典中key为egon的value值中字典的key为status对应的value值
print(d['egon']['timeout'])#打印字典中key为egon的value值中字典的key为timeout对应的value值
要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构
class User:#定义User类
db_path='user.db' #定义类的数据属性
def __init__(self,username): #定义类的特有属性
self.username=username
@property
def db(self): #定义类的函数属性,此时是被property装饰过的函数属性
data=open(self.db_path,'r').read()#执行只读方式打开文件user.db
return eval(data)#将读取内容以字典结构返回
u=User('egon')#实例化一个对象u,传入参数egon
print(u.db['egon']) #打印对象u调用绑定方法得到的字典中egon所对应的value值
print(u.db['egon']['password'])#打印字典中key为egon的value值中字典的key为password对应的value值
要求三:分析下述代码的执行流程
1 import time #导入时间模块 2 class User:#定义Uers类 3 db_path='user.db' #定义数据属性 4 def __init__(self,name): #定义实例化对象的特有属性并传入name值 5 self.name=name 6 @property#将db函数执行结果作为一个属性给对象调用,同时附有函数db的setter方法 7 def db(self):#定义db函数 8 with open(self.db_path,'r') as read_file:#只读方式打开user.db文件 9 info=read_file.read()#读取内容 10 return eval(info)#返回读取内容 11 @db.setter#当修改或者增加是触发setter运行 12 def db(self,value): 13 with open(self.db_path,'w') as write_file:#写操作打开文件 14 write_file.write(str(value))#写入内容 15 write_file.flush()#立刻刷入新内容 16 17 def login(self):#定义函数属性,登陆操作 18 data=self.db#触发db函数运行并返回值,date得到函数返回的值 19 if data[self.name]['status']:#如果得到status的内容为True 20 print('已经登录')#提示已经登陆 21 return True 22 if data[self.name]['timeout'] < time.time():#如果得到status为False且timeout值小于时间戳 23 count=0#设定计数器 24 while count < 3:#三次以内循环 25 passwd=input('password>>: ')#提示输入密码 26 if not passwd:continue#密码错误继续循环 27 if passwd == data[self.name]['password']:#如果密码正确 28 data[self.name]['status']=True#status得到True状态值 29 data[self.name]['timeout']=0#timeout重置为0 30 self.db=data#重新将db函数的值写到文件内 31 break 32 count+=1#错误计数一次 33 else: 34 data[self.name]['timeout']=time.time()+10#如果得到的status为False且timeout等于时间戳+10秒 35 self.db=data#重新写入 36 else: 37 print('账号已经锁定10秒')#所有条件都不满足账号锁定10秒 38 39 u1=User('egon')#实例化对象u1并传入egon参数 40 u1.login()#调用login()函数登陆 41 42 u2=User('alex')#实例化对象u2并传入alex参数 43 u2.login()#调用login()函数登陆
要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间
1 import time #导入时间模块 2 class User:#定义Uers类 3 db_path='user.db' #定义数据属性 4 def __init__(self,name): #定义实例化对象的特有属性并传入name值 5 self.name=name 6 @property#将db函数执行结果作为一个属性给对象调用,同时附有函数db的setter方法 7 def db(self):#定义db函数 8 with open(self.db_path,'r') as read_file:#只读方式打开user.db文件 9 info=read_file.read()#读取内容 10 return eval(info)#返回读取内容 11 @db.setter#当修改或者增加是触发setter运行 12 def db(self,value): 13 with open(self.db_path,'w') as write_file:#写操作打开文件 14 write_file.write(str(value))#写入内容 15 write_file.flush()#立刻刷入新内容 16 17 def login(self):#定义函数属性,登陆操作 18 data=self.db#触发db函数运行并返回值,date得到函数返回的值 19 if data[self.name]['status']:#如果得到status的内容为True 20 print('已经登录')#提示已经登陆 21 return True 22 if data[self.name]['timeout'] < time.time():#如果得到status为False且timeout值小于时间戳 23 count=0#设定计数器 24 while count < 3:#三次以内循环 25 passwd=input('password>>: ')#提示输入密码 26 if not passwd:continue#密码错误继续循环 27 if passwd == data[self.name]['password']:#如果密码正确 28 data[self.name]['status']=True#status得到True状态值 29 data[self.name]['timeout']=0#timeout重置为0 30 self.db=data#调用setter方法重新将db函数的值写到文件内 31 break 32 count+=1#错误计数一次 33 else: 34 data[self.name]['timeout']=time.time()+10#如果得到的status为False且timeout等于时间戳+10秒 35 self.db=data#调用setter方法重新写入 36 else: 37 print('账号已经锁定10秒')#所有条件都不满足账号锁定10秒 38 def Quit(self):#定义退出函数属性 39 data=self.db##触发db函数运行并返回值,date得到函数返回的值 40 if data[self.name]["status"]:#判断data得到的status得到的数据为True时 41 data[self.name]["timeout"]=0#重置时间为零 42 data[self.name]["status"]=False#重置状态为False 43 self.db=data#调用setter方法重新写入文件 44 print("您已退出!") 45 else:#status值为False时 46 print("您未登录,无需退出操作!") 47 @property 48 def Lock_time(self):#定义查看锁定时间函数 49 if self.db[self.name]["timeout"]>time.time():#如果文件内容中记录的时间大于时间戳 50 print("剩余时间%s"%(int(self.db[self.name]["timeout"] - time.time())))#打印剩余的锁定时间 51 else:#如果文件中的记录时间不大于时间戳 52 print("您的账号没有被锁定!")#打印 53 54 u1=User('egon')#实例化对象u1并传入egon参数 55 u1.login()#调用login()函数登陆 56 # u2=User('alex')#实例化对象u2并传入alex参数 57 # u2.login()#调用login()函数登陆 58 # u1.Quit()#对象u1退出 59 # u2.Quit()#对象u2退出 60 u1.Lock_time#查看账号剩余锁定时间