python - 为什么非覆盖描述符被隐藏但覆盖描述符没有?
问题描述
为什么__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
反而?这对我来说似乎是一个矛盾。
解决方案
推荐阅读
- listview - listview 中动态创建的条目的边框颜色在 xamarin 中未按预期工作
- python - Calendar.weekday ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
- outlook - 在发送之前和删除事件之前添加 Outlook Web
- java - Google Cloud Dataflow - Java SDK 与 Python SDK
- java - 为什么我们要在 java 代码中设置系统属性?
- c++ - ubuntu16.04 上的 sublime text 3 中的 C++ goto 定义有什么解决方案吗?
- python - 如何在 Python 中使用正则表达式匹配此模式
- python - 这个损失在 [num_steps, loss, _] = sess.run(.......) 中意味着什么?
- crop - 在 AMP-HTML 中裁剪图像
- java - 使用 Spark / Java 获取每行数据帧的当前时间戳