2018-07-16-Python全栈开发day27-面向对象进阶-描述符-part3

1.描述符

  描述符是一个新式类,凡是类中含有get,set,delete这三种方法之一的类都可以称之为描述符

  其中,至少含有get和set的称之为数据描述符,仅含有get方法的称之为非数据描述符

  1.1 描述符的作用

    描述符

    

class Test:
    def __set__(self, instance, value):#instance就是实例,value是方法
        print(instance)
        print(value)
    def __get__(self, instance, owner):
        print(instance)
        print(owner)#这个就是类
        print('this is get')
    def __delete__(self, instance):
        print(instance)
class Fun:
    name=Test()#用描述符来代理name
p1=Fun()
p1.name#调用name,会到Test里面去找get方法
p1.name='ggg'#调用set方法
del p1.name
===
<__main__.Fun object at 0x000002C11B37CEF0>
<class '__main__.Fun'>
this is get
<__main__.Fun object at 0x000002C11B37CEF0>
ggg
<__main__.Fun object at 0x000002C11B37CEF0>

1.2 描述符的优先级

  getattribute

  类属性

  数据描述符

  实例属性

  非数据描述符

  getattr

  依次进行按顺序选取

  1.2.1 类属性与数据描述符的比较

      

class Test:
    # def __set__(self, instance, value):#instance就是实例,value是方法
        # print(instance)
        # print(value)
        # print('set')
    def __get__(self, instance, owner):
        # print(instance)
        # print(owner)#这个就是类
        print('get')
    # def __delete__(self, instance):
        # print(instance)
        print('del')

class Fun:
    name = Test()
    def __getattr__(self, item):
        print('getattr')


# print(Fun.name)#比较类属性和实例属性选择哪一个
# print(Fun.__dict__)
# Fun.name=1#如果数据描述符优先级比较高的话,应该调用set,但是直接调用了类属性
# print(Fun.name)
#数据描述符和实例属性比较
p1=Fun()
# p1.name=18#正常的话会直接写入到字典里
# print(p1.__dict__)#但是字典中什么都没有,所以被代理了
#只剩下get成为非数据描述符之后,实例属性在前面
p1.xzzxxxx#找不到就直接出发getattr

 

转载于:https://www.cnblogs.com/hai125698/p/9321133.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值