首页 > 解决方案 > 为什么非覆盖描述符被隐藏但覆盖描述符没有?

问题描述

为什么__set__当存在同名的实例属性时,未实现的描述符会被 Python 中的实例属性所掩盖,而对于确实实现的描述符则不然__set__

毕竟,两种类型的描述符都有一个,所以在检索值时__get__不应该使用它吗?__get__

作为问题的一个例子,假设我们有以下 shell 会话。

>>> class OverridingDescriptor:
...     def __set__(self, instance, value):
...         instance.__dict__["over"] = value
...     def __get__(self, instance, owner):
...         print(self.__class__.__name__ + ".__get__")
...         return instance.__dict__["over"]
...
>>> class NonOverridingDescriptor:
...     def __get__(self, instance, owner):
...         print(self.__class__.__name__ + ".__get__")
...         return instance.__dict__["nonover"]
...
>>> class Container:
...     over = OverridingDescriptor()
...     nonover = NonOverridingDescriptor()
...
>>> c = Container()
>>> c.over = 14
>>> c.nonover = 14
>>> vars(c)
{'over': 14, 'nonover': 14}
>>> c.over
OverridingDescriptor.__get__
14
>>> c.nonover
14

为什么不是最后一行

>>> c.nonover
NonOverridingDescriptor.__get__
14

反而?这对我来说似乎是一个矛盾。

标签: pythonpython-descriptors

解决方案


推荐阅读