【问题标题】:How to determine if a Python class attribute is read only/writeable?如何确定 Python 类属性是否是只读/可写的?
【发布时间】:2017-03-31 20:16:52
【问题描述】:

我正在尝试使用inspect.getmembers() 列出类的所有可写属性。有没有办法查询一个类属性是只读的还是可写的?

编辑:我正在使用https://stackoverflow.com/a/3818861/2746401 的第一个解决方案,并在尝试复制只读属性(例如__doc__)时出错。我想过滤我们的这些只读属性,只复制可写的属性

【问题讨论】:

  • 你打算如何处理这些信息?只读或可写对您意味着什么(您是在谈论像@property 这样的描述符吗?通过__getattr[ibute]__/__setattr__ 的干扰呢?)
  • 我正在使用来自stackoverflow.com/a/3818861/2746401 的第一个解决方案,并且在复制只读属性(例如 doc)时出现错误。我想归档我们的这些只读属性,只复制可写的。
  • edit在问题中包含上下文。

标签: python python-3.x


【解决方案1】:

默认情况下,大多数名称都是可设置的。 data descriptor objects 和定义 __setattr__ hook 的类除外。

数据描述符是具有__get__ method 和至少__set____delete__ 方法的类的任何属性。当您尝试在类的 instance 上设置或删除属性时,将使用这些方法。

带有__set__ 方法的数据描述符可能不可写,这取决于它们所允许的确切描述符实现。一个property object就是这样一个数据描述符;如果propertyfset 属性设置为None,它将不可写。如果 property().fset 未设置为 None 而是设置为可调用对象,则该可调用对象确定属性是否可写。

此外,任何只有__delete__ 方法的数据描述符也无法写入,缺少__set__ 方法会在您尝试在实例上设置属性名称时导致AttributeError

__setattr__ 钩子拦截所有属性设置,并且可以防止任何此类操作失败。还有一个对应的__delattr__钩子,如果你想把删除属性算作写入,这很重要。

换句话说,一旦涉及描述符或__setattr__ 钩子,这真的很难确定,不是以一般方式。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多