【发布时间】:2012-03-11 18:41:25
【问题描述】:
如何获取 python 类的所有属性名称包括从超类继承的那些属性?
class A(object):
def getX(self):
return "X"
x = property(getX)
a = A()
a.x
'X'
class B(A):
y = 10
b = B()
b.x
'X'
a.__class__.__dict__.items()
[('__module__', '__main__'), ('getX', <function getX at 0xf05500>), ('__dict__', <attribute '__dict__' of 'A' objects>), ('x', <property object at 0x114bba8>), ('__weakref__', <attribute '__weakref__' of 'A' objects>), ('__doc__', None)]
b.__class__.__dict__.items()
[('y', 10), ('__module__', '__main__'), ('__doc__', None)]
如何通过 b 访问 a 的属性? 需要:“给我一份来自 b 的所有 属性 名称的列表,包括从 a 继承的那些!”
>>> [q for q in a.__class__.__dict__.items() if type(q[1]) == property]
[('x', <property object at 0x114bba8>)]
>>> [q for q in b.__class__.__dict__.items() if type(q[1]) == property]
[]
当使用第二个 (b) 时,我想从第一个 (a) 中获取结果,但当前只能得到一个空列表。这也应该适用于从 B 继承的另一个 C。
【问题讨论】:
-
请注意,
y不是属性,它只是一个整数。你想要所有可能不是函数的类变量吗? -
如果你关心 Python 风格(PEP 8),或者如果你不需要能够做函数调用版本(你会如果你通过
super()---super(...).x = 'Y'设置属性会失败),只需使用property作为装饰器,如@property,def x(self): return 'X'。 -
感谢这些 cmets。我试图创建一个简单的示例而不是我的复杂代码,是的,因此我没有考虑 PEP8。我不关心
y,因为我只需要属性。
标签: python reflection properties parent introspection