• property练习


    作业一:总结
    1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性
    2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性
    3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性

     1 # 1.
     2 #在类中定义的(self)方法都是绑定到对象的方法
     3 #定义
     4 class 人:
     5     def 中国人(self):#绑定到对象的方法
     6         pass
     7 #调用:
     8 c = 人() #实例化
     9 c.中国人()#调用对象,传参
    10 
    11 # 2.
    12 #静态方法和类方法都是绑定到类的方法
    13 #静态方法定义:
    14 class 类的静态函数:
    15     @staticmethod#调用装饰器staticmethod
    16     def 静态函数():#静态方法
    17         pass
    18 #调用:
    19 类的静态函数.静态函数()#不用实例化直接类函数名.就可以调用静态方法,静态方法是让类去调用的方法
    20 
    21 
    22  #类方法定义:
    23 class 类函数:
    24     @classmethod#定义类方法,需要调用装饰器classmethod
    25     def 类的方法(cls):#被classmethod修饰过的类的方法就是一个类方法
    26         pass
    27 #调用:
    28 类函数.类的方法()#不用实例化直接类函数名.就可以调用类方法
    29 #类方法是与类绑定的方法,也给类调用的方法
    30 #当类调用类方法时,会将当前调用方法的类当做第一个参数传递到方法中
    31 # 3.什么是解除绑定的函数,如何定义,如何调用,给谁用?有什么特性
    32 #定义在类的内部,并且被staticmethod修饰过的方法
    33 #定义:
    34 class 不带功能:
    35     @staticmethod
    36     def 不带(a,b,c):
    37         pass
    38 #调用:
    39 没有功能 = 不带功能.不带(1,2,3)
    40 #or:
    41 没功能 = 不带功能()
    42 没功能1 = 没功能.不带(1,2,3)
    43 #解除绑定方法不在自动传值
    4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
     1 #什么propert?
     2 class 属性类:
     3     def __init__(自身, 取=None, 赋=None, 删=None):
     4         自身.取 = 5         自身.赋 = 6         自身.删 = 7 
     8     def __get__(自身, 触发者, 所有者):
     9         return 自身.取(触发者)
    10 
    11     def __set__(自身, 触发者, 值):
    12         自身.赋(触发者, 值)
    13 
    14     def __delete__(自身, 触发者):
    15         自身.删(触发者)
    16 
    17 
    18 class C:
    19     def __init__(自身):
    20         自身._x = None
    21 
    22     def 取(自身):
    23         return 自身._x
    24 
    25     def 赋(自身, 值):
    26         自身._x =27 
    28     def 删(自身):
    29         del 自身._x
    30 
    31     x = 属性类(取, 赋, 删)
    32 
    33 
    34 if __name__ == '__main__':
    35     c = C()
    36     print(c.x)
    37     c.x = 'X=man'
    38     print(c.x)
    39     print(c._x)
    40     del c.x
    41 #一般在__属性的情况下使用property,这样可以有效的隐藏,展示,控制__属性对用户的影响
    如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?

    property(fget=None, fset=None, fdel=None, doc=None)

    条条大路通罗马,同样是完成一件事,Python 其实提供了好几个方式供你选择。

    property() 是一个比较奇葩的BIF,它的作用把方法当作属性来访问,从而提供更加友好访问方式。

    官方帮助文档代码: 

     1 class C:
     2     def __init__(self):
     3         self._x = None
     4 
     5     def getx(self):
     6         return self._x
     7     def setx(self, value):
     8         self._x = value
     9     def delx(self):
    10         del self._x
    11     x = property(getx, setx, delx, "I'm the 'x' property.")

    property() 返回一个可以设置属性的属性,当然如何设置属性还是需要我们人为来写代码。第一个参数是获得属性的方法 名(例子中是 getx),

    第二个参数是设置属性的方法名(例子中是 setx),第三个参数是删除属性的方法名(例子中是 delx)。

    property() 有什么作用呢?举个例子,在上边的例题中,我们为用户提供 setx 方法名来设置 _x 属性,

    提供 getx 方法名来 获取属性。但是有一天你心血来潮,突然想对程序进行大改,可能你需要把 setx 和

    getx 修改为 set_x 和 get_x,那你不得 不修改用户调用的接口,这样子的体验就非常不好。

    有了 property() 所有问题就迎刃而解了,因为像上边一样,我们为用户访问 _x 属性只提供了 x 属性。

    无论我们内部怎么改 动,只需要相应的修改 property() 的参数,用户仍然只需要去操作 x 属性即可,对他们来说没有任何影响。 

    使用属性修饰符创建描述符 

    使用属性修饰符创建描述符,也可以实现同样的功能.

    官方帮助文档代码: 

     1 class C:
     2     def __init__(self):
     3         self._x = None
     4 
     5     @property
     6     def x(self):
     7         """I'm the 'x' property."""
     8         return self._x
     9 
    10     @x.setter
    11     def x(self, value):
    12         self._x = value
    13 
    14     @x.deleter
    15     def x(self):
    16         del self._x

    注意:三个处理 _x 属性的方法名要相同(参数不同)。

     要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构

     1 #要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构
     2 with open('user.db','w') as write_file:#创建并以写入的方式打开一个文件user.db
     3     write_file.write(str({
     4         "egon":{"password":"123",'status':False,'timeout':0},
     5         "alex":{"password":"456",'status':False,'timeout':0},
     6         }))#在user.db中加入两个用户信息以字典的方式储存
     7 
     8 with open('user.db','r') as read_file:#以只读的方式打开一个文件user.db
     9     data=read_file.read()#读取user.db中的数据
    10     d=eval(data)#将user.db中的数据转为字典
    11     print(d['egon']['password'])#打印字典中egon的password 对应value
    12     print(d['egon']['status'])
    13     print(d['egon']['timeout'])
    14 
    15 定义文件结构
    16 #要求二:定义用户类,定义属性db,执行obj.db可以拿到用户数据结构
    17 class User: #定义User类
    18     db_path='user.db'
    19     def __init__(self,username): #在实例化User类时,传入Username参数的值
    20         self.username=username
    21     @property#将db()方法作为属性,让用户调用
    22     def db(self):
    23         data=open(self.db_path,'r').read()#以只读的方式打开文件user.db
    24         return eval(data)#以字典的方式返回user.db中的内容
    25 u=User('egon')#实例化对象u,传入egon
    26 print(u.db['egon'])#打印又u.db()返回的字典中,对应egon的value
    27 print(u.db['egon']['password'])#打印又u.db()返回的字典中,对应egon的password,value
    28 
    29 获取用户信息

    要求三:分析下述代码的执行流程

     1 #要求三:分析下述代码的执行流程
     2 import time
     3 class User:#定义User类
     4     db_path='user.db'
     5     def __init__(self,name): #在实例化User类时,传入name参数的值
     6         self.name=name
     7     @property#将db()方法作为属性,让用户调用,同时产生db.setter和db.del方法
     8     def db(self):
     9         with open(self.db_path,'r') as read_file:#当调用db方法时,打开文件user.db
    10             info=read_file.read()
    11             return eval(info)#以字典的方式返回user.db中的用户信息
    12     @db.setter#在对db属性进行修改操作的时候,调用此方法
    13     def db(self,value):
    14         with open(self.db_path,'w') as write_file:#创建并打开一个文件user.db
    15             write_file.write(str(value))#在文件中写入db属性得到的值
    16             write_file.flush()#刷新文件的缓冲区域,让数据立刻写入文件
    17     def login(self): #定义login方法
    18         data=self.db#data得到db方法(现在被@property修饰过的属性)返回的user.db中的数据
    19         if data[self.name]['status']:#判断name的status字段是否为Ture
    20             print('已经登录')
    21             return True
    22         if data[self.name]['timeout'] < time.time(): #判断name的timeout字段值是否小于....呃~1970年到现在的时间
    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#更改用户的登陆状态
    29                     data[self.name]['timeout']=0#超时字段归0
    30                     self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作
    31                     break
    32                 count+=1#只允许用户输入三次错误的机会
    33             else:
    34                 data[self.name]['timeout']=time.time()+10#如果三次输入错误,那么该用户将被锁定10秒
    35                 self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作
    36         else:#如果判断用户的timeout大于1970年到现在的值
    37             print('账号已经锁定10秒')
    38 
    39 u1=User('egon') #实例化u1传入name,egon
    40 print("egon login:")
    41 u1.login()#u1调用login的方法

    要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间

     1 #要求四:根据上述原理,编写退出登录方法(退出前要判断是否是登录状态),自定义property,供用户查看自己账号的锁定时间
     2 import time
     3 class User:#定义User类
     4     db_path='user.db'
     5     def __init__(self,name): #在实例化User类时,传入name参数的值
     6         self.name=name
     7         print("%s Login:"%self.name)
     8     @property#将db()方法作为属性,让用户调用,同时产生db.setter和db.del方法
     9     def db(self):
    10         with open(self.db_path,'r') as read_file:#当调用db方法时,打开文件user.db
    11             info=read_file.read()
    12             return eval(info)#以字典的方式返回user.db中的用户信息
    13     @db.setter#在对db属性进行修改操作的时候,调用此方法
    14     def db(self,value):
    15         with open(self.db_path,'w') as write_file:#创建并打开一个文件user.db
    16             write_file.write(str(value))#在文件中写入db属性得到的值
    17             write_file.flush()#刷新文件的缓冲区域,让数据立刻写入文件
    18     @property
    19     def UserLockTime(self):
    20         return int(self.db[self.name]["timeout"]-time.time())
    21     def loginOut(self):
    22         data = self.db
    23         if(data[self.name]['status']):
    24             print(self.name, "正在登出.....")
    25             data[self.name]['status'] = False
    26             self.db = data
    27             time.sleep(2)
    28             print(self.name,"登出成功!")
    29         else:
    30             print(self.name,"并没有登陆")
    31     def login(self): #定义login方法
    32         data=self.db#data得到db方法(现在被@property修饰过的属性)返回的user.db中的数据
    33         if data[self.name]['status']:#判断name的status字段是否为Ture
    34             print('已经登录')
    35             return True
    36         if data[self.name]['timeout'] < time.time(): #判断name的timeout字段值是否小于....呃~1970年到现在的时间
    37             count=0
    38             while count < 3:
    39                 passwd=input('password>>: ')#输入密码
    40                 if not passwd:continue#如果密码为空,那么重新循环到输入密码
    41                 if passwd == data[self.name]['password']: #输入密码正确
    42                     data[self.name]['status']=True#更改用户的登陆状态
    43                     data[self.name]['timeout']=0#超时字段归0
    44                     self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作
    45                     print("欢迎%s登陆,马上为您进行登出服务"%self.name)
    46                     time.sleep(3)
    47                     break
    48                 count+=1#只允许用户输入三次错误的机会
    49             else:
    50                 data[self.name]['timeout']=time.time()+20#如果三次输入错误,那么该用户将被锁定20秒
    51                 self.db=data#将改写过的值重新调用db.setter方法存入user.db文件中,在用户看来就是对db属性进行了重新的赋值操作
    52         else:#如果判断用户的timeout大于1970年到现在的值
    53             print('账号已经锁定20秒,剩余%s秒'%self.UserLockTime)
    54 u1=User('egon') #实例化u1传入name,egon
    55 u1.login()#u1调用login的方法
    56 u1.loginOut()#u1调用loginOut方法
    57 u2=User('alex')
    58 u2.login()
    59 
    60 三次登陆Property功能升级版
  • 相关阅读:
    图解VS2008单元测试及查看代码覆盖率
    Effective C++:条款02:尽量以const, enum, inline替换#define (Prefer consts, enums, and inline to #defines.)
    Effective C++:条款01:视C++为一个语言联邦(View C++ as a federation of languages.)
    Effective C++:条款03:尽可能使用const (Use const whenever possible.)
    mysql foreign key <转>
    Linux下Apache绑定多个域名的方法 <转>
    python(1)input()和raw_input
    《精通CSS》读书笔记(1)
    CSS相对定位和绝对定位
    【分享】沪江网提供的每日一句API
  • 原文地址:https://www.cnblogs.com/lixiaomingpython/p/6751861.html
Copyright © 2020-2023  润新知