zoukankan      html  css  js  c++  java
  • property练习

    一:总结
    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()
  • 相关阅读:
    开发培训体会——写好代码的一些编码规则和设计原则
    开发培训体会——写好代码的一些基本原理
    传说中的奖励通报
    NetBeans 6.7 Milestone 2 Now Available for Download!
    Software Process Engine of BeyondTrack
    开发培训体会——代码的价值
    NetBeans 6.7 Milestone 2 Now Available for Download!
    传说中的奖励通报
    有关_sprintf函数重定义错误的思考
    Software Process Engine of BeyondTrack
  • 原文地址:https://www.cnblogs.com/xuzheng940806/p/6748497.html
Copyright © 2011-2022 走看看