У меня есть тестовая структура, которая требует, чтобы тестовые примеры определялись с использованием следующих шаблонов классов:
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()
Однако теперь у меня есть несколько тестовых примеров, для которых я не хочу, чтобы метод __init__
вызывался до тех пор, пока не будет вызван метод run
, но я мало контролирую структуру или методы структуры. Как я могу отсрочить вызов __init__
без переопределения методов __init__
или run
?
Update
Предположения о том, что это возникло как проблема XY, верны. Сотрудник спросил меня этот вопрос некоторое время назад, когда я поддерживал указанную тестовую структуру. Я больше интересовался тем, чего он действительно пытался достичь, и мы выяснили более простой способ обхода, который не включал изменение структуры или введение метаклассов и т.д.
Тем не менее, я все еще думаю, что это вопрос, который стоит изучить: если бы я хотел создать новые объекты с "ленивой" инициализацией ( "ленивый", как в ленивых генераторах оценки, таких как range
и т.д.), что было бы лучше способ его достижения? Моя лучшая попытка пока приведена ниже, мне интересно узнать, есть ли что-нибудь более простое или менее подробное.