如何确定Python类属性是只读/可写?

时间:2017-03-31 11:04:22

标签: python python-3.x

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

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

1 个答案:

答案 0 :(得分:3)

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

的类

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

__set__方法的数据描述符可能不可写,并且它依赖于他们允许的确切描述符实现。 property object是这样的数据描述符;如果property的{​​{1}}属性设置为fset,则无法写入。如果None未设置为property().fset而是设置为可调用,则该可调用项将确定该属性是否可写。

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

AttributeError挂钩拦截所有属性设置,可以防止任何此类操作失败。还有一个相应的__setattr__挂钩,如果您想将删除属性计为写入,这很重要。

换句话说,一旦涉及描述符或__delattr__挂钩,这很难确定,而不是通用的方式。