【发布时间】:2017-12-24 23:03:48
【问题描述】:
我有一个测试框架,它要求使用以下类模式定义测试用例:
class TestBase:
def __init__(self, params):
self.name = str(self.__class__)
print('initializing test: {} with params: {}'.format(self.name, params))
class TestCase1(TestBase):
def run(self):
print('running test: ' + self.name)
当我创建并运行测试时,我得到以下信息:
>>> test1 = TestCase1('test 1 params')
initializing test: <class '__main__.TestCase1'> with params: test 1 params
>>> test1.run()
running test: <class '__main__.TestCase1'>
测试框架搜索并加载它可以找到的所有TestCase 类,实例化每个类,然后为每个测试调用run 方法。
load_test(TestCase1(test_params1))
load_test(TestCase2(test_params2))
...
load_test(TestCaseN(test_params3))
...
for test in loaded_tests:
test.run()
但是,我现在有一些测试用例,在调用 run 方法之前我不希望调用 __init__ 方法,但我对框架结构或方法几乎没有控制权。如何在不重新定义__init__ 或run 方法的情况下延迟对__init__ 的调用?
更新
这源于XY problem 的推测是正确的。不久前,当我维护所说的测试框架时,一位同事问了我这个问题。我进一步询问了他真正想要实现的目标,我们找到了一个更简单的解决方法,不涉及更改框架或引入元类等。
但是,我仍然认为这是一个值得研究的问题:如果我想创建具有“惰性”初始化的新对象(“惰性”,如 range 等惰性求值生成器中的“惰性”),什么是最好的实现它的方式?到目前为止,我的最佳尝试如下所示,我很想知道是否有更简单或更简洁的方法。
【问题讨论】:
-
是否只是为了延迟一些与
self.name相关的繁重初始化? -
在某些情况下,是的。
-
然后更好地使它们成为属性并在它们的吸气剂中完成繁重的工作。现在听起来像是XY problem。
-
如果没有您禁止的更改,就无法实现您的要求,但如果您更深入地了解您的要求,我认为有人可以帮助您。
-
你能添加超类或元类到
TestBase吗?
标签: python python-3.x