python_描述符

系统 1459 0

描述符:

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

描述符的作用:

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

数据描述符:(完整)

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

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

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

三个魔术方法:

            
              __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_ _
【仅仅针对类/对象某一个成员的设置,描述符可对不同的类使用】


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论