Python:如何仅通过dir()获取导入模块中定义的类?

19 投票
3 回答
29437 浏览
提问于 2025-04-17 23:25

我有一个用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中定义的所有类的列表,而不包括那些其他的东西。Python中有没有办法做到这一点?

3 个回答

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”函数,实际上不太安全。我建议你还是按照推荐的答案来做。

8

你可以使用 Python 类浏览器

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 中定义的所有类

50

使用 inspect 模块可以查看正在运行的对象:

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

这样就可以获取到在 my_module 里定义的每一个 class 了。

撰写回答