作业一:总结
1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
只要是在类内部定义的,并且没有被任何装饰器修饰过的方法,都是绑定到对象的方法
class Foo:
def test(self): #绑定到对象的方法
pass
def test1(): #也是绑定到对象的方法,只是对象.test1(),会把对象本身自动传给test1,因test1没有参数所以会抛出异常
pass
绑定到对象,指的是:就给对象去用,
使用方式:对象.对象的绑定方法(),不用为self传值
特性:调用时会把对象本身当做第一个参数传给对象的绑定方法
2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
在类内部定义的,并且被装饰器@classmethod修饰过的方法,都是绑定到类的
class Foo:
def test(self): #绑定到对象的方法
pass
def test1(): #也是绑定到对象的方法,只是对象.test1(),会把对象本身自动传给test1,因test1没有参数所以会抛出异常
pass
绑定到对象,指的是:就给对象去用,
使用方式:对象.对象的绑定方法()
特性:调用时会把对象本身当做第一个参数传给对象的绑定方法
3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
既不与类绑定,也不与对象绑定,不与任何事物绑定
绑定的特性:自动传值(绑定到类的就是自动传类,绑定到对象的就自动传对象)
解除绑定的特性:不管是类还是对象来调用,都没有自动传值这么一说了
所以说staticmethod就是相当于一个普通的工具包
class Foo:
def test1(self):
pass
def test2():
pass
@classmethod
def test3(cls):
pass
@classmethod
def test4():
pass
@staticmethod
def test5():
pass
test1与test2都是绑定到对象方法:调用时就是操作对象本身
<function Foo.test1 at 0x0000000000D8E488>
<function Foo.test2 at 0x0000000000D8E510>
test3与test4都是绑定到类的方法:调用时就是操作类本身
<bound method Foo.test3 of <class '__main__.Foo'>>
<bound method Foo.test4 of <class '__main__.Foo'>>
test5是不与任何事物绑定的:就是一个工具包,谁来都可以用,没说专门操作谁这么一说
<function Foo.test5 at 0x0000000000D8E6A8>
4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则
作业二:
1 with open('user.db','w') as write_file: 2 write_file.write(str({ 3 "egon":{"password":"123",'':False,'timeout':0}, 4 "alex":{"password":"456",'status':False,'timeout':0}, 5 }))
#以只写的方式打开一个名为‘user.db’的文件,在文件中写入两个用户的name,password,status,timeout等信息!
1 with open('user.db','r') as read_file: 2 data=read_file.read() 3 d=eval(data) 4 print(d['egon']['password']) 5 print(d['egon']['status']) 6 print(d['egon']['timeout'])
#以只读的方式打开一个名为‘user.db’的文件,并将name为egon的password,status,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'])
u=user('egon')首先进行实例化,传入egon
print(u.db['egon'])会执行property装饰过的函数,user.db中取值,取出字典中以egon为key的value,然后打印出egon的信息
print(u.db['egon']['password'])会执行上步同样操作,会在以egon为的key的value中{"password":"123",'status':False,'timeout':0}取出以password为key的值,然后打印出来("123")
要求三:分析下述代码的执行流程
1 import time 2 class User: 3 db_path='user.db' 4 def __init__(self,name): 5 self.name=name 6 @property 7 def db(self): 8 with open(self.db_path,'r') as read_file: 9 info=read_file.read() 10 return eval(info) 11 @db.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 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()
当用户status属性为True的时候为登录状态,
(1)如果输入为空,继续循环
(2)如果passwd==data[self.name]['password'],将data[self.name]['status']赋值True,data[self.name]['timeout']赋值为0,并执行@db.setter装饰下的db函数,将data这个改动后的值以字符串形式覆盖写入user.db文件中,结束循环,如果此时在执行函数,将输出‘已经登录’
如果passwd!=data[self.name]['password'],count自加一,继续循环,如果连续三次输入错误跳出while循环,并data[self.name]['timeout']辅助为time.time()+10,如果此时在执行函数,会显示‘账号已经锁定10秒’,十秒后再执行函数将重执行上述流程
要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间
1 import time 2 class User: 3 db_path='user.db' 4 def __init__(self,name): 5 self.name=name 6 @property 7 def db(self): 8 #打开user.db文件,以只读的方式 9 with open(self.db_path,'r') as read_file: 10 info=read_file.read() 11 return eval(info) 12 @db.setter 13 def db(self,value): 14 # 打开user.db文件,以只写的方式 15 with open(self.db_path,'w') as write_file: 16 write_file.write(str(value)) 17 write_file.flush() 18 def login(self): 19 data=self.db 20 if data[self.name]['status']: 21 print('已经登录') 22 return True 23 if data[self.name]['timeout'] < time.time(): 24 count=0 25 while count < 3: 26 passwd=input('password>>: ') 27 if not passwd:continue 28 if passwd == data[self.name]['password']: 29 data[self.name]['status']=True 30 data[self.name]['timeout']=0 31 self.db=data 32 break 33 count+=1 34 else: 35 data[self.name]['timeout']=time.time()+10 36 self.db=data 37 else: 38 print('账号已经锁定10秒') 39 @property 40 def out(self): # 退出登录 41 data = self.db 42 if data[self.name]['status']: 43 data[self.name]['status'] = False 44 data[self.name]['timeout'] = 0 45 self.db = data 46 else: 47 print('没登录,无法退出!') 48 49 @property # 查看账户锁定时间 50 def timeout(self): 51 with open(self.db_path, 'r') as read_file_1: 52 info1 = eval(read_file_1.read()) 53 time_out = info1[self.name]['timeout'] 54 print(time_out) 55 56 57 u1=User('egon') 58 # u1.login() 59 u1.out 60 u1.timeout 61 # u2=User('alex') 62 # u2.login()