I've got a module written in Python. I now want to import it into another script and list all classes I defined in this module. So I try:
>>> import my_module
>>> dir(my_module)
['BooleanField', 'CharField', 'DateTimeField', 'DecimalField', 'MyClass', 'MySecondClass', 'ForeignKeyField', 'HStoreField', 'IntegerField', 'JSONField', 'TextField', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'datetime', 'db', 'division', 'os', 'struct', 'uuid']
The only two classes which I defined in my_module are MyClass
and MySecondClass
, the other stuff are all things that I imported into my_module
.
I now want to somehow be able to get a list of all classes which are defined in my_module
without getting all the other stuff. Is there a way to do this in Python?
Use the inspect
module to inspect live objects:
>>> import inspect
>>> import my_module
>>> [m[0] for m in inspect.getmembers(my_module, inspect.isclass) if m[1].__module__ == 'my_module']
That should then work, getting every class
defined within that my_module
.
You can use Python Class Browser
import pyclbr
module_name = 'your_module'
module_info = pyclbr.readmodule(module_name)
print(module_info)
for item in module_info.values():
print(item.name)
it will list all classes defined in your_module
If you really want to use dir(), here it is:
>>> import module
>>> [eval("module." + objname) for objname in dir(module) if type(eval("module." + objname)) is type]
or (script form)
import module
classes = []
for objname in dir(module):
obj = eval("module." + objname)
if type(obj) is type:
classes.append(obj)
print(classes)
But this uses the "eval" function, and is really not safe for use. I'd stick to the chosen answer
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With