描述符
如果一个类中包含了三个魔术方法(__get__,__set__,__delete__)之一或者全部的类这个类就是一个描述符
描述符的作用就是对类/对象中某个成员进行详细的管理操作。
同时具备三个魔术方法的类就是数据描述符。
没有同时具备三个魔术方法的类就是非数据描述符。
三个魔术方法
__get__()
触发时机:在访问对象成员属性(该成员已经交给描述符管理的时候)的时候触发
作用:设置当前属性获取的值
参数:self 描述符的对象 / 第二个 管理成员的类的对象 / 第三个 管理成员的类
返回值:可有可无
注意事项:无
__set__()
触发时机:在设置对象成员属性(该成员已经交给描述符管理的时候)的时候触发
作用:对成员的值进行设置管理
参数:self 描述符的对象 / 第二个 管理成员的类的对象 / 第三个 要设置的值
返回值:无
注意事项:设置值的时候一定要设置当前描述符对象的临时变量
__delete__()
触发时机:在删除对象成员属性(该成员已经交给描述符管理的时候)的时候触发
作用:对成员的值进行删除管理
参数:self 描述符的对象 / 第二个 管理成员的类的对象
返回值:无
注意事项:删除值的时候一定要设置当前描述符对象的临时变量
属性魔术方法:【针对当前类/对象所有成员的管理,属性魔术方法仅对当前类有效】
描述符(是一个类):【仅仅针对类/对象某一个成员的设置,描述符可对不同的类使用】
描述符的第一种格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Descriptor: def __init__(self): self.tmpvar = '匿名用户'
def __get__(self,obj,cls): result = self.tmpvar[0] + '*' + self.tmpvar[-1] return result
def __set__(self,obj,val): if len(val) > 8: self.tmpvar = val[0:8] else: self.tmpvar = val
def __delete__(self,obj): if obj.isallowdel_username == True: del self.tmpvar
class Email: username = Descriptor() isallowdel_username = True password = '123456' phone = 1234567890
def login(self): print('这是登陆的方法') def logout(self): print('这是一个退出的方法')
mail = Email() print(mail.username) mail.username = 'lovemybaby' print(mail.username) del mail.username print(mail.username)
|
描述符的第二种格式
描述符融合到被管理的成员类当中(使用了property函数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class Email: isallowdel_username = False password = 1235678
def __init__(self): self.tmpvar = '匿名用户' def getusername(self): result = self.tmpvar[0] + '~' + self.tmpvar[-1] return result def setusername(self,val): self.tmpvar = val + 'sama' def deleteusername(self): if self.isallowdel_username == True: del self.tmpvar
def login(self): print('登陆邮箱的方法') def logout(self): print('退出邮箱的方法')
username = property(getusername,setusername,deleteusername)
mail = Email()
print(mail.username) del mail.username print(mail.username)
|
描述符的第三种格式
描述符融合到被管理的成员类当中(使用装饰器语法组合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Email: password = 123570
def __init__(self): self.tmpvar = '匿名用户'
@property def username(self): result = self.tmpvar[0:3] return result
@username.setter def username(self,val): self.tmpvar = val
@username.deleter def username(self): del self.tmpvar
def login(self): print('登陆邮箱的方法')
def logout(self): print('退出邮箱的方法')
mail = Email()
print(mail.username) del mail.username
|