Я имитирую распределенную систему, в которой все узлы следуют за некоторым протоколом. Это включает в себя оценку некоторых небольших изменений в протоколе. Вариант означает альтернативную реализацию одного метода. Все узлы всегда придерживаются той же вариации, которая определяется конфигурацией эксперимента (только одна конфигурация активна в любой момент времени). Какой самый лучший способ сделать это, не жертвуя успехом?Самый элегантный способ настройки класса в Python?
Как эксперимент может быть довольно обширным, я явно не хочу никаких условностей. Прежде чем я только что использовал наследование, как:
class Node(object):
def dumb_method(self, argument):
# ...
def slow_method(self, argument):
# ...
# A lot more methods
class SmarterNode(Node):
def dumb_method(self, argument):
# A somewhat smarter variant ...
class FasterNode(SmarterNode):
def slow_method(self, argument):
# A faster variant ...
Но теперь мне нужно, чтобы проверить все возможные варианты и не хочу экспоненциальное числа классов захламления источника. Я также хочу, чтобы другие люди смотрели на код, чтобы понять его с минимальными усилиями. Каковы ваши предложения?
Редактировать: Одна вещь, которую я не смог подчеркнуть достаточно: для всех предполагаемых случаев использования кажется, что исправление класса при конфигурации является хорошим. Я имею в виду: его можно заставить работать простым Node.dumb_method = smart_method
. Но почему-то это не чувствовать себя право. Может ли такое решение вызвать серьезную головную боль для случайного умного читателя?
Поддерживать список методов? Насколько я вижу, нет ничего, что требовало бы выделенных классов. Взгляните на шаблон стратегии. – phant0m
Да, это более или менее то, что * стратегия * для. Но здесь это более ограничено тем, что в любой момент каждый клиент будет использовать точно такую же стратегию. Таким образом, объект, инкапсулирующий алгоритм, кажется излишним, и я хочу избежать потери ресурсов. – lRem
Но у вас уже есть объект «инкапсулирования» алгоритма: класс.Имейте в виду, что каждый класс является экземпляром объекта (это метакласс, по умолчанию «тип») – phant0m