Python:只使用dir()获取导入模块中定义的类?

时间:2014-03-22 13:57:04

标签: python class import module

我有一个用Python编写的模块。我现在想将它导入另一个脚本并列出我在此模块中定义的所有类。所以我试试:

>>> 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']

我在my_module中定义的唯一两个类是MyClassMySecondClass,其他的东西都是我导入my_module的东西。

我现在想要以某种方式获得my_module中定义的所有类的列表,而不会获得所有其他内容。有没有办法在Python中执行此操作?

3 个答案:

答案 0 :(得分:21)

使用inspect模块检查实时对象:

>>> import inspect
>>> import my_module
>>> [m[0] for m in inspect.getmembers(my_module, inspect.isclass) if m[1].__module__ == 'my_module']

那应该有效,在class内定义每个my_module

答案 1 :(得分:5)

您可以使用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)

它将列出your_module

中定义的所有类

答案 2 :(得分:1)

如果真的想要使用dir(),那么它就是:

>>> import module
>>> [eval("module." + objname) for objname in dir(module) if type(eval("module." + objname)) is type]

或(脚本形式)

import module
classes = []
for objname in dir(module):
    obj = eval("module." + objname)
    if type(obj) is type:
        classes.append(obj)
print(classes)

但是这使用了“eval”功能,实际上并不安全。我坚持the chosen answer