列出父类的属性对象

2024-10-03 06:29:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图列出类的可设置属性。你知道吗

使用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\u a':property\u 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\u c':property\u object}。我需要{varu c':property\u object,'varu a':property\u object}

我知道这是因为我自己。classdict只返回该类的dict,而不是所有父类的dict。class namespace

所以我的问题是他们有没有办法得到一个相当于听写的班级及其家长?你知道吗

我试着使用dir(self),它确实会给我所有属性的名称,但它并没有给我属性对象。并使用getattr(self,'property\u name')返回属性的.fget()值,而不是属性对象。你知道吗

vars(B)也只返回{var\u B':property object}


Tags: nameselfreturn属性objectinitvaluevar
1条回答
网友
1楼 · 发布于 2024-10-03 06:29:24

找到了一个使用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

相关问题 更多 >