Как получить доступ к свойствам суперклассов Python, например, через __class __.__ dict__? - PullRequest
7 голосов
/ 21 февраля 2012

Как я могу получить все имена свойств класса 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? Нужно: «Дайте мне список всех свойств имен из 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]
[]

Я хочу получить результаты первого (а), при работе со вторым (б), но только текущий может получить пустой список. Это также должно работать для другого C, унаследованного от B.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Вы можете использовать dir():

for attr_name in dir(B):
    attr = getattr(B, attr_name)
    if isinstance(attr, property):
        print attr
3 голосов
/ 21 февраля 2012

Вы можете использовать либо «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)
>>> 
...