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 |
如果我使用
我怎么才能只得到
检查类的
我很抱歉回答了这样一个老问题,但我不愿意使用检查模块来解决这个问题。我在某个地方读到了在生产中使用不安全的内容。
将模块中的所有类初始化为列表中的无名称对象
见安东尼斯·克里斯托菲兹评论回答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() |