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

How do you get all classes defined in a module but not imported?

我已经看到了下面的问题,但它并不能让我找到我想要的地方:如何在Python中获得当前模块中所有类的列表?

尤其是,我不希望导入类,例如,如果我有以下模块:

1
2
3
4
5
6
7
8
9
10
11
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,除了本模块中定义的3之外。

我怎么才能只得到NewClassAnotherClassYetAnotherClass


检查类的__module__属性,找出在哪个模块中定义了它。


我很抱歉回答了这样一个老问题,但我不愿意使用检查模块来解决这个问题。我在某个地方读到了在生产中使用不安全的内容。

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

见安东尼斯·克里斯托菲兹评论回答1。

我得到了测试对象是否是如何检查变量是否为类?

所以这是我的免费检查解决方案

1
2
3
4
5
6
7
8
9
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)


我使用了以下内容:

1
2
3
4
5
# Predicate to make sure the classes only come from the module in question
def pred(c):
    return inspect.isclass(c) and c.__module__ == pred.__module__
# fetch all members of module __name__ matching 'pred'
classes = inspect.getmembers(sys.modules[__name__], pred)

我不想在


您还可以考虑在标准库中使用"python class browser"模块:http://docs.python.org/library/pyclbr.html

由于它实际上并没有执行所讨论的模块(它只是简单的源代码检查),所以有一些特定的技术它并不完全正确地理解,但是对于所有"普通"类定义,它将准确地描述它们。


1
2
3
from pyclbr import readmodule

clsmembers = readmodule(__name__).items()