introspection – Get all object attributes in Python?
introspection – Get all object attributes in Python?
Use the built-in function dir()
.
I use __dict__
and dir(<instance>)
Example:
class MyObj(object):
def __init__(self):
self.name = Chuck Norris
self.phone = +6661
obj = MyObj()
print(obj.__dict__)
print(dir(obj))
# Output:
# obj.__dict__ --> {phone: +6661, name: Chuck Norris}
#
# dir(obj) --> [__class__, __delattr__, __dict__, __doc__,
# __format__, __getattribute__, __hash__,
# __init__, __module__, __new__, __reduce__,
# __reduce_ex__, __repr__, __setattr__,
# __sizeof__, __str__, __subclasshook__,
# __weakref__, name, phone]
introspection – Get all object attributes in Python?
What you probably want is dir()
.
The catch is that classes are able to override the special __dir__
method, which causes dir()
to return whatever the class wants (though they are encouraged to return an accurate list, this is not enforced). Furthermore, some objects may implement dynamic attributes by overriding __getattr__
, may be RPC proxy objects, or may be instances of C-extension classes. If your object is one these examples, they may not have a __dict__
or be able to provide a comprehensive list of attributes via __dir__
: many of these objects may have so many dynamic attrs it doesnt wont actually know what it has until you try to access it.
In the short run, if dir()
isnt sufficient, you could write a function which traverses __dict__
for an object, then __dict__
for all the classes in obj.__class__.__mro__
; though this will only work for normal python objects. In the long run, you may have to use duck typing + assumptions – if it looks like a duck, cross your fingers, and hope it has .feathers
.