Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access properties of Python super classes e.g. via __class__.__dict__?

How can I get all property names of a python class including those properties inherited from super classes?

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

How can I access properties of a via b? Need: "Give me a list of all property names from b including those inherited from 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]
[]

I want to get results from the first (a), when working with the second (b), but current only can get an empty list. This also should work for another C inherited from B.

like image 800
user1156548 Avatar asked Feb 21 '12 12:02

user1156548


1 Answers

You can use dir():

for attr_name in dir(B):
    attr = getattr(B, attr_name)
    if isinstance(attr, property):
        print attr
like image 98
Sven Marnach Avatar answered Nov 12 '22 07:11

Sven Marnach