我需要列出作为属性并具有setter的类的所有属性。例如,这个类:
class MyClass(object):
def __init__(self):
self. a = 1
self._b = 2
self._c = 3
@property
def b(self):
return self._b
@property
def c(self):
return self._c
@c.setter
def c(self, value):
self._c = value
我需要获取属性c但不是a和b。 使用此答案:https://stackoverflow.com/a/5876258/7529716 我可以获得属性对象b和c。
但他们是一种了解这些属性是否具有除尝试之外的setter的方法:
inst = MyClass()
try:
prev = inst.b
inst.b = None
except AttributeError:
pass # No setter
finally:
inst.b = prev
提前致谢。
答案 0 :(得分:3)
property
objects分别在fget
,fset
和fdel
属性中存储他们的getter,setter和deleter。如果某个媒体资源没有设置者或删除者,则该属性设置为None
。
这意味着您只需过滤掉fset
属性设置为None
的属性:
def get_writeable_properties(cls):
return [attr for attr, value in vars(cls).items()
if isinstance(value, property) and value.fset is not None]
>>> get_writeable_properties(MyClass)
['c']