我已经看到了以下问题,但它并没有让我想到我想要的地方: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之外,它还会返回MyBaseClass
和SomeOtherClass
。
我如何才能获得NewClass
,AnotherClass
和YetAnotherClass
?
答案 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()