AttributeError:'module'对象没有属性'modules'

时间:2014-02-06 16:30:49

标签: python class

这与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个骨架类;它没有抛出任何错误。

3 个答案:

答案 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)]