gpt4 book ai didi

python - 从 super 调用所有子类方法?

转载 作者:行者123 更新时间:2023-11-30 23:35:43 25 4
gpt4 key购买 nike

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

目前,所有测试都使用 BasicTest 中的两个函数:构造函数(尽管将来显然可能会被覆盖)和 runTest() 方法,该方法是如果没有传入任何值,则 super 构造函数使用的默认方法名称(例如,BasicTest() 将创建一个测试,该测试将在调用时执行 runTest() 方法,而 BasicTest('Foo') 将使用 Foo() 方法)。

我想让runTest()简单地从调用它的继承对象运行所有可能的测试。但是,由于 runTest() 仅在 BasicTest 中定义并由子类继承,因此我正在寻找一种从父类动态调用所有子类方法的方法。我知道这违反了 OO 编程的规则,但从我看来,Python 从一开始就不是一个遵守规则的人:)

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

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

sub = SubClassTest() 
sub.runTest()

运行TestParse()TestExec(),但我希望在中定义并继承runTest()方法>BasicTest 而不被覆盖。

最佳答案

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

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方法

class BaseTest():
test_method_list = []
__metaclass__ = TestMetaclass
def runTests(self):
for method in self.test_method_list:
method(self)

在此之后,所有子类都将使用此元类构建

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

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

TestOne().runTests()

关于python - 从 super 调用所有子类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17110987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com