相关文章推荐
绅士的茴香  ·  安装cplex到python_mob64ca ...·  1 月前    · 
个性的饼干  ·  实用的 Python 之 ...·  4 周前    · 
霸气的花卷  ·  python list 错位相减 ...·  昨天    · 
憨厚的大脸猫  ·  python ...·  昨天    · 
重情义的香菇  ·  javascript - Using ...·  1 年前    · 
from os.path import isfile, join mypath = 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

The output is:

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

However, the following code works properly:

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

你能帮助我找出错误所在吗?

3 个评论
最后一大块代码的输出是什么,使其正确?
它输出 example.ClassA。如果明确地将模块命名为 inspect.getmembers(example.py),就可以工作了。
你确定你真的通过了example.py,而不是在做完import example之后的example
python
class
Konstantin
Konstantin
发布于 2014-03-02
2 个回答
Martijn Pieters
Martijn Pieters
发布于 2014-03-02
已采纳
0 人赞同

inspect.getmembers() works on objects,而你传递的是字符串。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
    
你也可以通过告诉inspect.getmembers通过传递inspect.isclass作为第二个参数来进行过滤来节省一个步骤。
谢谢你的精彩回答,我把字符串和文件名搞乱了!我的测试是在一个文件夹中进行的。当我有几个带测试的子文件夹时,也应该这样做吗?我有:几个文件夹,每个文件夹中都有一些Python文件。我需要从这些文件中获取所有的类名来启动所有的测试。
@Konstantin:那些子文件夹有__init__.py的文件吗?它们要么需要是包(所以importlib.import_module(filename, package='dirname')可以工作),要么你需要将子文件夹添加到sys.path中,这样Python在导入时就能找到这些文件。
anon582847382
anon582847382
发布于 2014-03-02
0 人赞同

Try this, using the inspect module:

import sys
import inspect