我正在尝试使用inspect.getmembers()
列出类的所有可写属性。有没有办法查询类属性是只读还是可写?
编辑:我正在使用https://stackoverflow.com/a/3818861/2746401中的第一个解决方案,并在尝试复制只读属性时遇到错误(例如__doc__
)。我想过滤这些只读属性,只复制可写的属性
答案 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__
挂钩,这很难确定,而不是通用的方式。