python_描述符

描述符:

如果一个类中包含了三个魔术方法(getsetdelete)之一或者全部的类这个类就是一个描述符

描述符的作用:

描述符的作用就是对类/对象中某个成员进行详细的管理操作。

数据描述符:(完整)

同时具备三个魔术方法的类就是数据描述符

非数据描述符(不完整):

没有同时具备三个魔术方法的类就是非数据描述符

三个魔术方法:

__get__():
    触发时机:在访问对象成员属性(该成员已经交给描述符管理的时候)的时候触发
    作用:设置当前属性获取的值
    参数:self 描述符的对象  / 第二个 被管理成员的类的对象  / 第三个  被管理成员的类
    返回值:可有可无,有的话就是获取的值
    注意事项:无

__set__():
    触发时机:在设置对象成员属性(该成员已经交给描述符管理的时候)的时候触发
    作用:对成员的值进行设置管理
    参数:self 描述符的对象  / 第二个 被管理成员的类的对象  / 第三个  要设置的值
    返回值:无
    注意事项:设置值的时候一定要设置当前描述符对象的临时变量

__delete__():
    触发时机:在删除对象成员属性(该成员已经交给描述符管理的时候)的时候触发
    作用:对成员的值进行删除管理
    参数:self 描述符的对象  / 第二个 被管理成员的类的对象
    返回值:无
    注意事项:删除值的时候一定要删除当前描述符对象的临时变量

例:
class Descriptor:
    #初始化一个临时的成员属性(代替原有username的操作)
    def __init__(self):
        self.tmpvar = '匿名用户'#属性随便给,这个就是控制的入口
    #定义描述符的三个成员
    def __get__(self,obj,cls):#self 描述符的对象  obj Email对象mail  cls Email类
        #希望获取用户名的时候仅仅返回第一个和最后一个字符 其余的都隐藏
        result = self.tmpvar[0] + '*' + self.tmpvar[-1]
        return result
    def __set__(self,obj,val):#self 描述符的对象   / obj Email对象mail  /val 要设置的值
        #设置值的时候一定要设置当前描述符对象的临时变量
        #限制用户名不能超过8个字符
        #检测字符个数
        if len(val) > 8:
            self.tmpvar = val[0:8]
        else:
            self.tmpvar = val
    def __delete__(self,obj):#self 描述符的对象/ obj Email对象mail
        #删除临时变量即可
        if obj.isallowdel_username == True:
            del self.tmpvar
    #声明一个类(邮箱)
class Email:
    #成员属性
    username = Descriptor()#用户名 交给描述符管理 [交接行为]
    #设置一个是否允许删除username的标志
    isallowdel_username = True
# 实例化对象
mail = Email()
# 访问用户名
#print(mail.username)
# 设置用户名
mail.username = 'lovemybaby'
# print(mail.username)
# 删除用户名的操作
print(mail.username)
del mail.username
# print(mail.username)

描述符和属性魔术方法:

属性魔术方法
_ _getattribute_ _
_ _getattr_ _
_ _setattr_ _
_ _delattr_ _
【针对当前类/对象所有成员的管理,属性魔术方法仅对当前类有效】

描述符(是一个类):
_ _get_ _
_ _set_ _
_ _delete_ _
【仅仅针对类/对象某一个成员的设置,描述符可对不同的类使用】

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值