你如何获得在模块中定义的所有类,但没有导入?
我已经看到了下面的问题,但是它并没有让我想到我想要的地方: 我如何获得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之外,它还会返回MyBaseClass
和SomeOtherClass
。
我怎样才能得到NewClass
, AnotherClass
和YetAnotherClass
?
检查类的__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()