Wow, more than I had asked for, thank you Tim!

I ended up doing this:

def isClass(object):
    if 'classobj' in str(type(object)):
        return 1
    elif "'type'" in str(type(object)):
        return 1
    else:
        return 0
def listClasses():
    classes = []
    for eachobj in globals().keys():
        if isClass(globals()[eachobj]):
            classes.append(globals()[eachobj])
            print eachobj
    return classes

Tim Chase wrote:
> > Is there a method or attribute I can use to get a list of
> > classes defined or in-use within my python program? I tried
> > using pyclbr and readmodule but for reason that is dogslow.
>
> Well, given that so  much in python is considered a class, the
> somewhat crude code below walks an object/module and emits
> details regarding what's going on.  I couldn't find any nice
> method for determining if a variable referenced a module other
> than checking to see if that item had both a "__file__" and a
> "__name__" attribute.  Likewise, the check for whether something
> is an object is a bit crude.
>
>
>  >>> def inspect(thing, name = '', indent=0):
> ...     if hasattr(thing, "__file__") and hasattr(thing, "__name__"):
> ...             #assume it's a module
> ...             print "%sModule %s" % ("\t" * indent, thing.__name__)
> ...             for subthing in dir(thing):
> ...                     objname = ".".join([name,
> subthing]).lstrip(".")
> ...                     inspect(eval(objname),
> ...                             objname, indent+1)
> ...     elif isinstance(thing, object):
> ...             print "%s%s is an object" % ("\t" * indent, name)
> ...
>  >>> import m1
>  >>> # m1 is a junk module that references module "m2" and has
>  >>> # some junk classes in it
>  >>> inspect(m1, "m1")
> Module m1
>          m1.M1Class is an object
>          m1.M1ObjectClass is an object
>          m1.__builtins__ is an object
>          m1.__doc__ is an object
>          m1.__file__ is an object
>          m1.__name__ is an object
>          Module m2
>                  m1.m2.M2Class is an object
>                  m1.m2.M2ObjectClass is an object
>                  m1.m2.__builtins__ is an object
>                  m1.m2.__doc__ is an object
>                  m1.m2.__file__ is an object
>                  m1.m2.__name__ is an object
>
>
>
> You could also filter out builtin object properties by wrapping
> that last print statement in something like
>
>       if not name.startswith("_"): print ...
>
> which might cut down on some of the noise.
> 
> Just a few ideas.
> 
> -tkc

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to