如何访问Python超类的属性,例如通过__class __.__ dict__?

时间:2012-02-21 12:41:37

标签: python reflection properties parent introspection

如何获取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)]

如何访问via b的属性? 需要:“给我一个包含b中所有属性名称的列表,包括那些从...继承的名称。”

>>> [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]
[]

我希望从第一个(a)获得结果,当使用第二个(b)时,但是当前只能获得一个空列表。这也适用于从B继承的另一个C.

2 个答案:

答案 0 :(得分:3)

您可以使用dir()

for attr_name in dir(B):
    attr = getattr(B, attr_name)
    if isinstance(attr, property):
        print attr

答案 1 :(得分:1)

您可以使用“dir”,也可以按照“mro”返回的元组中包含的所有类(方法解析顺序,由类上的__mro__属性给出) - 稍后方法是揭示以后被子类覆盖的属性的唯一方法:

>>> class A(object):
...    b = 0
... 
>>> class B(A):
...   b = 1
... 
>>> for cls in B.__mro__:
...     for item in cls.__dict__.items():
...         if item[0][:2] != "__":
...            print cls.__name__, item
... 
B ('b', 1)
A ('b', 0)
>>>