Я реализую шаблон разработки метода шаблона в python, и у меня есть вопрос о том, должна ли вспомогательная функция в шаблонном методе абстрактного класса быть экземпляром или функцией stati c. Оба будут работать, но я не уверен в достоинствах и недостатках обоих подходов.
Справочная информация
Я пишу фреймворк для поддержки тестирования изображений, где я могу подключить различные методы тестирования. в зависимости от типа изображения et c, поэтому я использую шаблон проектирования метода шаблона.
Абстрактный шаблонный метод класса для тестирования должен будет поддерживать параллельное тестирование изображений и поддерживать выполнение это либо с использованием многопроцессорной обработки (если выполняется локально), либо с помощью AWS лямбда-выражения, если выполняется на AWS.
. Я хочу инкапсулировать детали 'run_tests_locally' и 'run_tests_lambda' в вспомогательные функции, чтобы избежать беспорядка метод основного шаблона.
Вопрос
Мой вопрос заключается в том, лучше ли сделать приведенные выше функции run_tests в качестве A) методов экземпляра или B) stati c методов в моем абстрактном классе определение. ... см. Ниже
Казалось бы, оба работают, но не уверены, какой из них лучше, и хотели бы получить некоторые советы / мысли
from abc import ABC, abstractmethod
import util.misc as misc
class TestFramework(ABC):
"""
Abstract class for executing tests
"""
@abstractmethod
def filter(self, objs):
"""Take list of objects, and return filtered list of those to test"""
pass
@abstractmethod
def do_test(self, obj):
"""Take a single object, test it, and return dict of results"""
pass
def execute_test(self, file_list):
"""Execute test"""
# library function
all_objs = misc.load_files(file_list)
# instance template function - shortlist objects
to_test_objs = self.filter(all_objs)
# now test objects
# how is it best to implment the 'run_tests' functions?
# A) instance methods?
# B) static methods?
# if running on aws, do tests across multiple lambda
# if local, use MP to run in parallel
if env = 'aws':
# as an instance method
test_results = self.run_tests_lambda(to_test_objs)
# as static:
test_results = run_tests_lambda_STATIC(to_test_objs, self.do_test)
else:
# instance form:
test_results = self.run_tests_local(to_test_objs)
# static form:
test_results = run_tests_local_STATIC(to_test_objs, self.do_test)
return test_results
# instance method implementation
def run_tests_local(self, to_test_objs):
all_results = {}
with ProcessPoolExecutor as e:
procs = [e.submit(self.do_test, obj) for obj in to_test_objs]
for proc in as_completed(procs):
all_results.update(proc.result())
return all_results
# static method implementation
@staticmethod
def run_tests_local_STATIC(to_test_objs, test_fn):
all_results = {}
with ProcessPoolExecutor as e:
procs = [e.submit(test_fn, obj) for obj in to_test_objs]
for proc in as_completed(procs):
all_results.update(proc.result())
return all_results