我需要获取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
你能帮我弄清楚错误是什么吗?
答案 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)
这在实时文件中运行。