检查类属性是否带有setter

时间:2018-04-20 13:59:57

标签: python python-2.7 properties

我需要列出作为属性并具有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  

提前致谢。

1 个答案:

答案 0 :(得分:3)

property objects分别在fgetfsetfdel属性中存储他们的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']