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

Jas*_*n S 5 python descriptor python-2.7

来自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
Run Code Online (Sandbox Code Playgroud)

为什么该__get__方法可以访问type但其他两个方法不能访问?

Tri*_*put 4

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

考虑以下代码

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
>>>
Run Code Online (Sandbox Code Playgroud)

  • 这“不是”“正常”设置和检索值。您将它们设置在描述符 it*self* 上,该描述符在 `MyClass` 的所有实例之间共享! (2认同)