python获取类名 - python获取类的参数




如何获得Python中当前模块中的所有类的列表? (5)

关于什么

g = globals().copy()
for name, obj in g.iteritems():

我已经看到很多人从一个模块中提取所有类的例子,通常是这样的:

# foo.py
class Foo:
    pass

# test.py
import inspect
import foo

for name, obj in inspect.getmembers(foo):
    if inspect.isclass(obj):
        print obj

真棒。

但我无法找到如何从当前模块中获取所有类。

# foo.py
import inspect

class Foo:
    pass

def print_classes():
    for name, obj in inspect.getmembers(???): # what do I do here?
        if inspect.isclass(obj):
            print obj

# test.py
import foo

foo.print_classes()

这可能是非常明显的,但我一直无法找到任何东西。 谁能帮我吗?


另一个在Python 2和3中工作的解决方案:

#foo.py
import sys

class Foo(object):
    pass

def print_classes():
    current_module = sys.modules[__name__]
    for key in dir(current_module):
        if isinstance( getattr(current_module, key), type ):
            print(key)

# test.py
import foo
foo.print_classes()

尝试这个:

import sys
current_module = sys.modules[__name__]

在你的情况下:

import sys, inspect
def print_classes():
    for name, obj in inspect.getmembers(sys.modules[__name__]):
        if inspect.isclass(obj):
            print(obj)

甚至更好:

clsmembers = inspect.getmembers(sys.modules[__name__], inspect.isclass)

因为inspect.getmembers()需要一个谓词。


我不知道是否有一个“正确”的方式来做到这一点,但是你的代码片段是正确的:只需将foo.py添加import foo ,做inspect.getmembers(foo) ,它应该可以正常工作。


import pyclbr
print(pyclbr.readmodule(__name__).keys())

请注意,stdlib的Python类浏览器模块使用静态源分析,因此它仅适用于由真实.py文件支持的模块。





inspect