20170421周作业

作业一:总结
1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
只要是在类内部定义的,并且没有被任何装饰器修饰过的方法,都是绑定到对象的
class Foo:
def test(self): #绑定到对象的方法
pass
def test1(): #也是绑定到对象的方法,只是对象.test1(),会把对象本身自动传给test1,因test1没有参数所以会抛出异常
pass
绑定到对象,指的是:就给对象去用
使用方式:对象.对象的绑定方法(),不用为self传值
特性:调用时会把对象本身当作第一个参数传给对象的绑定方法
2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
即类方法(classmethod),在类内部定义的,并且被装饰器@classmethod修饰过的方法,都是绑定到类的
class Foo:
def test(self): #绑定到对象的方法
pass
def test1() #也是绑定到对象的方法,只是对象.test1(),会把对象本身自动传给test1,因test1没有参数所以会抛出异常
pass
绑定到对象:指的是:就给对象去用
使用方式:对象.对象的绑定方法()
特性:调用时会把对象本身当作第一个参数传给对象的绑定方法
3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
即staticmethod,既不与类绑定,也不与对象绑定,不与任何事物绑定
绑定的特性:自动传值(绑定到类的就是自动传类,绑定到对象的自动传对象)
解除绑定的特性:不管是类还是对象来调用,都没有自动传值这么一说了
所以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是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
为什么要用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":{"password":"123",'status':False,'timeout':0},"alex":{"password":"456",'status':False,'timeout':0}}),执行结果就是分别取以egon为key的value中的各个key的值分别是“123”,“False”,“0”

 


要求二:定义用户类,定义属性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=user('egon')首先进行实例化,传入egon参数

print(u.db['egon'])会执行property装饰过的函数,user.db中取值,取出字典中以egon为key的value,然后打印出来({"password":"123",'status':False,'timeout':0})

print(u.db['egon']['password'])会执行上步同样操作,会在以egon为的key的value中{"password":"123",'status':False,'timeout':0}取出以password为key的值,然后打印出来("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
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()
答:首先导入时间模块(import time)

过程分析:

u1=User('egon')先进行实例化

u1.login()执行def login(self)函数

data=self.db执行@property装饰下的db函数,读取出文件user.db下的文件内容,赋值给data

if data[self.name]['status']对data字典中egon的key值下的status的key值进行判断,如果值为True,直接打印‘已经登录’,结束;如果值为Flase,进行if 判断,如果data[self.name]['timeout']<time.time(),进入while循环,输入passwd,进行如下判断:

(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,供用户查看自己账号的锁定时间

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()

 

posted on 2017-04-23 16:03  bigdata_devops  阅读(186)  评论(0编辑  收藏  举报

导航