你如何获得在模块中定义的所有类,但没有导入?

我已经看到了下面的问题,但是它并没有让我想到我想要的地方: 我如何获得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)就像链接问题中的接受答案所示,除了在此模块中定义的3之外,它还会返回MyBaseClassSomeOtherClass

我怎样才能得到NewClassAnotherClassYetAnotherClass

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

对于回答这样一个老问题,我表示歉意,但是我觉得在这个解决scheme中使用inspect模块并不舒服。 我读了一些在生产中不安全的地方。

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

见安东尼斯Christofides评论回答1 。

我得到了testing的答案,如果一个对象是一个类如何检查一个variables是否是一个类?

所以这是我的免检解决scheme

 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) 

您也可以考虑在标准库中使用“Python类浏览器”模块: http : //docs.python.org/library/pyclbr.html

由于它实际上并没有执行这个模块(它并没有进行真正的源代码检查),所以有一些具体的技术并不完全正确地理解,但是对于所有“正常”的类定义,它将会精确地描述它们。

我用了下面的:

 # 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) 

我不想input当前的模块名称

 from pyclbr import readmodule clsmembers = readmodule(__name__).items()