Reputation: 81
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.
Upvotes: 8
Views: 2335
Reputation: 110271
You can either use "dir", or you can follow all the classes that are contained in the tuple returned by "mro" (method resolution order,given by the __mro__
attribute on the class) - this later method is the only way of uncovering attributes that where later overriden by subclasses:
>>> 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)
>>>
Upvotes: 4
Reputation: 601559
You can use dir()
:
for attr_name in dir(B):
attr = getattr(B, attr_name)
if isinstance(attr, property):
print attr
Upvotes: 4