Python 描述符 data 和 non-data 两种类型

仅包含__get__的,是non-data descriptor, 如果实例__dict__包含同名变量, 则实例优先; 如果还包含__set__, 则是data descriptor, 优先于实例__dict__同名变量.

class c:
    pass

class a:
    def __init__(self, name):
        self.name = name
    def __get__(self, ins, cls):
        print('call %s get: '%type(self).__name__, end='')
        ins.__dict__[self.name] = c()
        return ins.__dict__[self.name]

class a2(a):
    def __set__(self, ins, val):
        ins.__dict__[self.name] = val
    
class t:
    x=a('x')
    y=a2('y')

b = t()
print(b.x)
print(b.x)
print(b.y)
print(b.y)

 

结果:

>>> 
call a get: <__main__.c object at 0x0000000002A47B00>
<__main__.c object at 0x0000000002A47B00>
call a2 get: <__main__.c object at 0x0000000002B27208>
call a2 get: <__main__.c object at 0x0000000002B27278>

 

转载于:https://www.cnblogs.com/xiangnan/p/4526886.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值