如何获取属于Python 3中特定类的所有属性(除了继承的属性)的值

时间:2017-08-30 06:32:33

标签: python python-3.x oop inheritance properties

如何(在Python 3中)获取属于特定类的所有属性的值。我只需要那些在没有继承的类中定义的特定类中的值(属性)。

以下是一些例子:

class A(object):
    def __init__(self, color):
        self._color = color

    @property
    def color(self):
        return self._color

class B(A):
    def __init__(self, color, height, width):
        super().__init__(color)
        self._height = height
        self._width = width

    @property
    def height(self):
        return self._height

    @property
    def width(self):
        return self._width

这是一个用于获取所有值(包括继承)的代码:

b_inst = B('red', 10, 20)
val = [{p: b_inst.__getattribute__(p)} for p in dir(B)
       if isinstance(getattr(B, p), property)]

print(val)

>> [{'color': 'red'}, {'height': 10}, {'width': 20}]

现在,我只想检索仅在class B中定义的属性值,即heightwidth

2 个答案:

答案 0 :(得分:2)

请注意,在Python" property"具有非常特定的含义(内置property类型)。如果您只关心这一点,那么您只需要查找您的子课程__dict__

val = [p.__get__(c) for k, p in type(c).__dict__.items() if isinstance(p, property)]

如果你想要任何适用于任意属性的东西,那么你要求的东西是不可能的,因为Python对象(有一些例外)是基于字典的(与基于结构的,如在C ++或Java中)和动态(任何一段代码都可以在每个实例的基础上添加/删除任意属性)因此,没有修复模式,也没有给定对象可能拥有或不拥有的属性的类级别定义。

答案 1 :(得分:-1)

if property == to attribute ,来自doc

  

属性赋值和删除更新实例的字典,   从来没有班级的字典。

所以,即使您在基类上执行self._color = color,也要将该属性/属性分配给B类的实例。

所以,至少你保存与属性/属性相关的信息以供咨询后者,我不认为考虑到Python的工作原理,你将能够确定哪个类的方法属性已分配属于,这就是您的问题在Python中的含义。

我希望这有助于您澄清Python的OOP模型。

如果你指的是Python的属性,那么@bruno的答案是完美的。我仍然会在这里留下这个答案,因为它与您的主题有关,可能对读者有用。