如何获取模块中定义但未导入的所有类?

时间:2011-04-02 01:51:14

标签: python introspection python-2.7

我已经看到了以下问题,但它并没有让我想到我想要的地方:How can I get a list of all classes within current module in 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

5 个答案:

答案 0 :(得分:24)

检查类的__module__属性,找出它所定义的模块。

答案 1 :(得分:12)

我为回答这么老的问题而道歉,但我觉得使用检查模块来解决这个问题并不舒服。我读到了一些在生产中不安全的地方。

Initialize all the classes in a module into nameless objects in a list

请参阅Antonis Christofides comment to answer 1

我得到的答案是测试一个对象是否是一个类 How to check whether a variable is a class or not?

所以这是我的免检查解决方案

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)

答案 2 :(得分:7)

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

由于它实际上没有执行有问题的模块(它确实进行了简单的源检查),因此有一些特定的技术并不能完全理解,但对于所有“普通”类定义,它会准确地描述它们。

答案 3 :(得分:7)

我使用了以下内容:

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

我不想在

中输入当前的模块名称

答案 4 :(得分:2)

from pyclbr import readmodule

clsmembers = readmodule(__name__).items()