如何调用通过inspect.getmembers发现的方法?

2 投票
2 回答
1579 浏览
提问于 2025-04-15 18:28
import re
import sys
import inspect
import testcases

testClass = re.compile(r'.*Case$')
testMethod = re.compile(r'.*Test$')

for class_name, class_obj in inspect.getmembers(testcases, inspect.isclass):
    if testClass.match(class_name):
        for method_name, method_obj in inspect.getmembers(class_obj, inspect.ismethod):
            if testMethod.match(method_name):
                # RIGHT HERE I WOULD LIKE TO INVOKE method_name

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

2 个回答

0

非常感谢你,alex,快速回复我。

第一个参数应该是某个类的实例——具体是哪个实例呢?你怎么获取或创建它呢?

好的,如果我理解正确的话,methodobj这个方法调用的第一个参数应该是classobj的一个实例?那接下来呢。

methodobj = getattr(classobj, method_name)
methodobj(classobj())

那其他参数呢?它们是什么,你想传什么值给它们?

不不,没有其他参数,那些都是方法里的测试案例,变量已经设置好了。我只是想添加测试案例,而不需要修改其他代码来运行它们。

再次感谢,我还没试过,但根据我对getattr的了解,它似乎正是我需要的。多试试,我应该能让它工作。

8

在你的代码之后:

for class_name, class_obj in inspect.getmembers(testcases, inspect.isclass):
    if testClass.match(class_name):
        for method_name, method_obj in inspect.getmembers(class_obj, inspect.ismethod):
            if testMethod.match(method_name):
                # RIGHT HERE I WOULD LIKE TO INVOKE method_name

你可以这样做:

            methodobj = getattr(classobj, method_name)
            methodobj("appropriate arguments go here")

如果,也就是说,你得对“合适的参数” 是什么 有一点了解。第一个参数通常是某个类的实例——哪个实例呢?你怎么获取或创建它?还有,其他参数呢?它们是什么,你想传什么值给它们?

准备好要调用的方法对象,这其实不是你面临的最大问题——如你所见,getattr 可以很轻松地做到这一点!-)——但在你的问题真正有意义之前,你需要对上面提到的其他问题(特别是第一个,关于你想调用方法的实例)有合理的答案!-)

撰写回答