【问题标题】:List property object of parent class列出父类的属性对象
【发布时间】:2018-10-03 08:34:26
【问题描述】:

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

使用 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': 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': property_object, 'var_a': property_object}

我知道这是由于 self.class.dict 只返回类的字典,而不是所有父类的字典。 class namespace

所以我的问题是他们获得相当于类的 dict 及其所有父级的方法?

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

vars(B) 也只返回 {'var_b': 属性对象}

【问题讨论】:

    标签: python inheritance properties


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 2019-11-14
      • 1970-01-01
      • 2010-09-20
      • 2011-02-10
      相关资源
      最近更新 更多