如何获取模块中定义但未导入的所有类?

53 投票
6 回答
31483 浏览
提问于 2025-04-16 14:55

我之前看到过一个类似的问题,但没有完全解决我的需求:在Python中,如何获取当前模块内所有类的列表?

特别是,我不想要那些被导入的类,比如如果我有以下这个模块:

from my.namespace import MyBaseClass
from somewhere.else import SomeOtherClass

class NewClass(MyBaseClass):
    pass

class AnotherClass(MyBaseClass):
    pass

class YetAnotherClass(MyBaseClass):
    pass

如果我像链接中的答案那样使用 clsmembers = inspect.getmembers(sys.modules[__name__], inspect.isclass),那么它会返回 MyBaseClassSomeOtherClass,还有这个模块中定义的三个类。

我该如何只获取 NewClassAnotherClassYetAnotherClass 呢?

6 个回答

12

你可能还想考虑使用标准库中的“Python类浏览器”模块:http://docs.python.org/library/pyclbr.html

因为它实际上并不会执行你要查看的模块,而是通过简单的源代码检查来了解内容,所以对于一些特定的技巧,它可能理解得不太准确。不过,对于所有“正常”的类定义,它能准确地描述出来。

13

抱歉我来回答这么老的问题,但我对使用inspect模块来解决这个问题不太放心。我在某个地方看到过说在生产环境中使用它不安全。

将模块中的所有类初始化为无名对象并放入列表中

可以查看Antonis Christofides对答案1的评论

我找到的判断一个对象是否是类的方法来自于如何检查一个变量是否是类?

所以这是我不使用inspect的解决方案

def classesinmodule(module):
    md = module.__dict__
    return [
        md[c] for c in md if (
            isinstance(md[c], type) and md[c].__module__ == module.__name__
        )
    ]

classesinmodule(modulename)
28

查看这个类的 __module__ 属性,可以知道它是在哪个模块里定义的。

撰写回答