As mentioned on SE one can get all the iterable properties of an object with either dir(someObject) or someObject.__dict__. How does one get the non-iterable properties? Some libraries, such as Reqests, return objects with non-iterable properties.
 
    
    - 1
- 1
 
    
    - 30,064
- 36
- 138
- 197
2 Answers
It's impossible to list all attributes reliably in every circumstance, for the simple fact that attributes can be defined at runtime using __getattr__ or __getattribute__.
For example the following class has a 50% chance to create a new attribute or to raise an AttributeError. 
import random
class AttributeGenerator(object):
    def __getattr__(self, attr):
        if random.random() < 0.5:
            setattr(self, attr, None)
            return getattr(self, attr) 
        else:
            raise AttributeError(attr)
The only general-purpose functions to get attributes from an instance are dir() and vars(). 
Note that dir() by default combines the result obtained by __dict__, __slots__ and the class' __dict__ etc. Classes can redefine how dir() works on their instances by defining the __dir__ method, however I've never seen it used.
If this method exists and "hides" some attributes for some reason you can simply do
something like:
attributes = list(object.__dict__.keys()) + list(obj.__slots__) + list(type(obj).__dict__)
(with the appropriate error checking!) in order to obtain the default's dir() output.
This said, if you are interested in a particular library then there might be some method specific for that library that works reliably.
 
    
    - 98,325
- 22
- 197
- 231
import pprint from pprint 
pprint (vars(<object name>))
 
    
    - 926
- 1
- 7
- 30
- 
                    1Thank you Monty. However, the non-iterable attributes are not exposed with `vars()`. – dotancohen Oct 29 '13 at 14:41