gpt4 book ai didi

python - 如何调用不同基类的函数

转载 作者:行者123 更新时间:2023-12-01 05:40:29 24 4
gpt4 key购买 nike

基于我有限的Python知识,我生成了以下代码片段:

#import statements skipped
class DTestWrapper(BaseA if inLinux else unittest.TestCase):

def setUpDTest(self):
if inLinux:
super(BaseA , self).setUpTestCase()
else:
super(unittest.TestCase, self).setUp()

def tearDownDTest(self):
if inLinux:
super(BaseA ,self).tearDownTestCase()
else:
super(unittest.TestCase,self).tearDown()

一些背景:
BaseA 是一个自定义类,用于将测试输出美化到表格中。它有成员函数setUpTestCasetearDownTestCase等等。

我想做的事情:
我想根据不同的平台为自己的类DTestWrapper调用不同的setUptearDown函数,如上面的代码所示。当它在Linux上运行时,我想使用BaseA setUptearDown函数;否则,我想使用 python unittest.TestCase 中的函数。我有另一个类 D 继承自 DTestWrapper,它将重写 setUpDTest 方法,但目前它只是空用于测试目的。

问题:
当我运行上面的代码片段时,似乎没有调用 setUpsetUpTestCase (测试全部失败,如果正确调用,则不应调用)。我的问题是:

如何在 DTestWrapper 中调用不同的 setUp 函数?这可能吗?

由于我正在学习,因此非常感谢任何反馈。谢谢。

最佳答案

super() 需要 current 类来搜索父类:

class DTestWrapper(BaseA if inLinux else unittest.TestCase):
def setUpDTest(self):
parent_method = 'setUpTestCase' if inLinux else 'setUp'
getattr(super(DTestWrapper, self), parent_method)()

def tearDownDTest(self):
parent_method = 'tearDownTestCase' if inLinux else 'tearDown'
getattr(super(DTestWrapper, self), parent_method)()

您可能希望将 BaseA 方法名称与 unittest.TestCase 方法相匹配,并在那里节省额外的 if 测试。简单的别名就可以了;例如,BaseA.tearDown = BaseA.tearDownTestCase

super()需要当前类来确定正确的方法解析顺序,这完全取决于基类的组合和顺序。如果您给它一个基类,那么 super() 将跳过该基类上的任何方法,因为它必须假设该基类是父类。

关于python - 如何调用不同基类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17661016/

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