ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

为什么描述符__get__可以访问对象的类型,但是__set__却不能呢?

2019-11-10 21:07:20  阅读:214  来源: 互联网

标签:python-2-7 descriptor python


https://docs.python.org/2/howto/descriptor.html开始:

descr.__get__(self, obj, type=None) --> value

descr.__set__(self, obj, value) --> None

descr.__delete__(self, obj) --> None

为什么__get__方法可以访问类型,而其他两个却不能呢?

解决方法:

在__get__中,类型实参是类名,这在通过类访问属性时很有用,因为在这种情况下obj(实例)将为None.在__set__中,您不需要类型参数,因为不可能通过类设置描述符的值,您只需用新值覆盖描述符即可.

考虑以下代码

class RevealAccess(object):
    """A data descriptor that sets and returns values
       normally and prints a message logging their access.
    """

    def __init__(self, initval=None, name='var'):
        self.val = initval
        self.name = name

    def __get__(self, obj, objtype):
        print 'Retrieving', self.name
        return self.val

    def __set__(self, obj, val):
        print 'Updating', self.name
        self.val = val

>>> class MyClass(object):
...     x = RevealAccess(10, 'var "x"')
...     y = 5
...
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> MyClass.x  # accessing descriptor x through class
Retrieving var "x"
20
>>> MyClass.x = 20  # class parameter x is overwritten with value 20, it's not a descriptor any more
>>>

标签:python-2-7,descriptor,python
来源: https://codeday.me/bug/20191110/2015211.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有