从super调用所有子类方法?

2024-04-25 11:58:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在为我公司的构建脚本实现一些单元测试。为了消除膨胀并使实现新测试更容易一些,我让所有的测试类从一个名为BasicTest的自定义子类继承自PyUnit的TestCase。在

当前有两个函数可供所有测试从BasicTest使用:构造函数(尽管它在将来很明显会被重写)和runTest()方法,这是超级的构造函数在没有传入值时使用的默认方法名(例如,BasicTest()将创建一个测试,该测试将在以下情况下执行runTest()方法调用,而BasicTest('Foo')将使用Foo()方法)。在

我想让runTest()从调用它的继承对象运行所有可能的测试。但是,由于runTest()只在BasicTest中定义并由子类继承,所以我正在寻找一种方法,从super动态调用所有子类的方法。我知道这违反了OO编程的规则,但据我所知,Python根本就不是一个遵守规则的人:)

为了清楚起见,以下是我的意图:

我希望从子类对象调用runTest(),并且只处理该对象的方法。假设SubclassTest()具有方法TestParse()和{}。我想要这样:

sub = SubClassTest() 
sub.runTest() 

运行TestParse()TestExec(),但我希望在BasicTest中定义并继承{}方法,而不重写。在


Tags: 对象方法函数脚本定义foo情况公司
2条回答

我们可以创建元类,它将所有有趣的子类方法收集到类属性中

class TestMetaclass(type):
    def __new__(cls, name, bases, attrs):
        own_tests = [v for k,v in attrs.iteritems() if k.startswith('test')]
        attrs['test_method_list'] = own_tests
        return super(TestMetaclass, cls).__new__(cls, name, bases, attrs)

将此元类设置为基类为__metaclass__ 并实现runTests方法

^{pr2}$

在这之后,所有的子类都将使用这个元类来构造

class TestOne(BaseTest):
    def test_foo(self):
        pass

最后,可以使用运行runTests()方法的收集方法

TestOne().runTests()

样本代码: 将base class.py文件作为模块加载 检查

import inspect
import imp
imp.load_source((name of class by which to want that module), (path base class name of file).py)
module = __import__((name of class by which to want that module))

inspect.getmembers(module) will give you dict of name, cls

希望这有帮助

相关问题 更多 >