首页 > 解决方案 > 设置类属性不使用描述符设置器

问题描述

问题:类属性显然不访问描述符的__set__方法。这是预期的还是有问题?

下面的代码演示了这个问题。代码直接来自Python 文档

class RevealAccess:
    """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)
        print(f'obj = {obj}')
        print(f'objtype = {objtype}')
        return self.val

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

class MyReveal:
    x = RevealAccess(10, 'var "x"')

创建实例的行为符合预期:

>>> mr = MyReveal()
>>> mr.x
Retrieving var "x"
obj = <__main__.MyReveal object at 0x139246eb8>
objtype = <class '__main__.MyReveal'>

>>> mr.x = 'set mr.x'
Updating var "x"
Retrieving var "x"
obj = <__main__.MyReveal object at 0x139246eb8>
objtype = <class '__main__.MyReveal'>

直接在类属性上使用时,其__get__行为符合预期:

>>> MyReveal.x
Retrieving var "x"
obj = None
objtype = <class '__main__.MyReveal'>
MyReveal.x=set mr.x

但是,当尝试设置时,__set__似乎被忽略了,并且该属性被覆盖,丢失了描述符:

>>> MyReveal.x = 'set MyReveal.x'
<no output>
>>> MyReveal.x
'set MyReveal.x'
>>> mr.x
'set MyReveal.x'

正如所见,来自描述符的诊断信息消失了,只剩下x属性的值只是裸露的 str。

这是预期的行为吗?或者,更有可能的是,我做错了什么?或者,一个错误?

标签: pythonclasssetterdescriptor

解决方案


推荐阅读