列出父类的属性对象

时间:2018-04-23 10:20:19

标签: python inheritance properties

我正在尝试列出类的可设置属性。

使用2个答案:list properies of classknow if properies is settable

对于这个课程,它可以工作。

class A(object):
    def __init__(self):
        self._var_a = 1
        self._var_b = 2

    @property
    def var_a(self):
        return self._var_a
    @var_a.setter
    def var_a(self, value):
        self._var_a = value

    @property
    def var_b(self):
        return self._var_b

    @property
    def settable_property(self):
        settable_properties = {}
        for name, value in self.__class__.__dict__.iteritems():
            if isinstance(value, property) and value.fset is not None:
                settable_properties[name] = value
        return settable_properties

a = A()
a.settable_property 

我得到{' var_a&#39 ;: property_object}。

但对于一个儿童班:

class B(A):
    def __init__(self):
        self._var_c = 1
        super(B, self).__init__()

    @property
    def var_c(self):
        return self._var_c
    @var_c.setter
    def var_c(self, value):
        self._var_c = value

b = B()
b.settable_property

我只得到{' var_c':property_object}。我期待{' var_c&#39 ;: property_object,' var_a&#39 ;: property_object}

我知道这是由于自我。 dict 只返回类的dict而不是所有父类。 class namespace

所以我的问题是他们可以获得一个等同于 dict 的班级及其所有人的父母?

我尝试使用dir(self),它确实为我提供了所有属性的名称,但它并没有给我属性对象。并使用getattr(self,' property_name')返回属性的.fget()值,而不是属性对象。

vars(B)也只返回{' var_b&#39 ;: property object}

1 个答案:

答案 0 :(得分:1)

使用inspect.getmembers

找到解决方案
def settable_property(self):
    settable_properties = {}
    for name, value in inspect.getmembers(self.__class__):
        if isinstance(value, property) and value.fset is not None:
            settable_properties[name] = value
    return settable_properties

使用dir和getattr的其他解决方案:

def settable_property(self):
    settable_properties = {}
    for name in dir(self.__class__:
        value = getattr(self.__class__, name)  # getattr on class not instance
        if isinstance(value, property) and value.fset is not None:
            # WARNING this property object is not bound to an instance
            # if you want to use it either pass the instance like:
            #     value.fget(self)
            # or bind the function to the instance: 
            #      value = value.fget.__get__(self, self.__class__)

            settable_properties[name] = value 
    return settable_properties