【问题标题】:Under what scenario non-data descriptor may NOT be overridden by instance dictionaries在什么情况下非数据描述符可能不会被实例字典覆盖
【发布时间】:2015-05-08 07:45:12
【问题描述】:

Descriptor HowTo Guide 的“调用描述符”部分中,它说:

" 数据描述符总是覆盖实例字典。

非数据描述符可能会被实例字典覆盖。 "

它还说:

" 该实现通过一个优先链进行工作,该链赋予数据描述符优先于实例变量,实例变量优先于非数据描述符,并为 __getattr__() (如果提供)分配最低优先级。 "

然后,非数据描述符应该始终被实例字典覆盖。为什么它在这里使用“可能是”?我该如何理解这句话?

【问题讨论】:

  • 它说 "may be" 因为您可能在实例字典中没有任何东西可以覆盖它们,不是因为如果您在实例字典来覆盖它们,它们永远不会被覆盖。
  • @jonrsharpe,你能提供一段代码来解释一下吗?
  • @jonrsharpe,我想我理解了这句话。谢谢。

标签: python descriptor


【解决方案1】:

考虑以下配置:

class data_descriptor:
    def __get__(self, obj, cls):
        return 'data descriptor'
    def __set__(self, obj, val):
        pass

class non_data_descriptor:
    def __get__(self, obj, cls):
        return 'non data descriptor'

class X:
    attr_data = data_descriptor()
    attr_non_data = non_data_descriptor()

数据描述符优先无论实例字典中是否有项目。但是,非数据描述符可以被实例字典中的项目隐藏。文档只写“可能被覆盖”,因为它取决于实例字典中是否存在冲突键。

这是一个演示:

>>> x = X()
>>> x.attr_data
'data descriptor'
>>> x.attr_non_data
'non data descriptor'
>>> # populate the instance dict with stuff
>>> x.__dict__.update({'attr_data': 'spam', 'attr_non_data': 'eggs'})  
>>> x.attr_data  # descriptor wins
'data descriptor'
>>> x.attr_non_data  # instance __dict__ wins
'eggs'
>>> del x.attr_non_data  # restore descriptor by removing name from __dict__
>>> x.attr_non_data
'non data descriptor'

有关为什么描述符协议以这种方式设计的讨论,请参阅here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多