如何(在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
中定义的属性值,即height
和width
。
答案 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的答案是完美的。我仍然会在这里留下这个答案,因为它与您的主题有关,可能对读者有用。