这与SO问题有关,解决方案为我提供了错误。
How can I get a list of all classes within current module in Python?
使用来自该SO答案的绿色检查代码,我想获得我自己的模块中所有类名的列表,locations.py:
import locations
def print_classes():
for name, obj in inspect.getmembers(locations.modules[__name__]):
if inspect.isclass(obj):
print obj
print_classes()
当我运行它时,我得到AttributeError:'module'对象没有属性'modules'
我测试了locations.py - 它包含31个骨架类;它没有抛出任何错误。
答案 0 :(得分:3)
接受的答案使用sys.modules
,不 locations.modules
:
for name, obj in inspect.getmembers(sys.modules[__name__]):
sys.modules
是包含所有导入模块对象的Python字典:
这是一个将模块名称映射到已加载的模块的字典。这可以被操纵以强制重新加载模块和其他技巧。请注意,从此字典中删除模块与在相应模块对象上调用
reload()
不同。
在您的情况下,您不需要sys.modules
,您已经拥有对模块对象的引用。你刚刚导入它,所以直接使用它:
for name, obj in inspect.getmembers(locations):
答案 1 :(得分:0)
您可以通过更改为sys.modules['locations']
或locations
:
注意:如果您使用相同的模块进行测试,则可以使用:sys.modules[__name__]
>>> import locations
>>> sys.modules['locations']
<module 'locations' from 'locations.pyc'>
>>> locations
<module 'locations' from 'locations.pyc'>
>>>
这是我的locations.py模块
class A(object): pass
class B(object): pass
class C(object): pass
class D(object): pass
这是我的testing.py脚本:
import locations
import inspect
def print_classes():
for name, obj in inspect.getmembers(locations):
if inspect.isclass(obj):
print obj
print_classes()
输出:
<class 'locations.A'>
<class 'locations.B'>
<class 'locations.C'>
<class 'locations.D'>
答案 2 :(得分:0)
您可能更喜欢列表理解,因为循环非常小。
from __future__ import print_function
from inspect import getmembers, isclass
import my_module
[print(obj) for obj in getmembers(my_module) if isclass(obj)]