获取Python包中的所有类名

时间:2014-03-01 20:21:01

标签: python class

我需要获取Python包中所有类的列表。 起初我得到所有文件名(它工作正常,从stackoverflow获取):

from os import listdir, getcwd
from os.path import isfile, join
mypath = os.getcwd()
onlyfiles = [ f for f in listdir(mypath) if isfile(join(mypath,f)) ]

然后我检查所有文件,但它无法正常工作:

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

输出结果为:

<type 'str'>
....
<type 'str'>

但是,以下代码可以正常运行:

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

你能帮我弄清楚错误是什么吗?

2 个答案:

答案 0 :(得分:6)

inspect.getmembers()适用于对象,并且您传入字符串。 Python不知道这些字符串包含文件名,或者将这些文件名视为要导入的模块。

您必须导入inspect.getmembers()的文件才能正常工作。因为您正在处理当前目录中的文件,所以您应该只能将它们全部导入:

import importlib

for x in onlyfiles:
    module = importlib.import_module(x)
    for name, obj in inspect.getmembers(module):
        if inspect.isclass(obj):
            print obj

请注意inspect.getmembers()接受第二个参数,该谓词允许您过滤方法返回的内容。您可以在此处使用inspect.isclass()作为谓词,而不是手动过滤:

for x in onlyfiles:
    module = importlib.import_module(x)
    for name, obj in inspect.getmembers(module, inspect.isclass):
        print obj

答案 1 :(得分:2)

使用inspect模块尝试此操作:

import sys
import inspect

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

这在实时文件中运行。