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

    作业一:总结
        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()
  • 相关阅读:
    usb_submit_urb
    xilinx uboot网卡驱动分析
    kernel: swapper: page allocation failure. order:1, mode:0x20
    Linux格式化硬盘 常用命令小记
    spring3:对JDBC的支持 之 JDBC模板类
    spring3: AOP 之代理机制
    spring3: AOP 之切面实例化模型 ——跟我学spring3
    spring3: AOP 之 通知顺序
    spring3: AOP 之 通知参数
    spring3: 切面及通知实例 Aspectj的aop
  • 原文地址:https://www.cnblogs.com/gz369521/p/6750273.html
Copyright © 2011-2022 走看看