Каков самый чистый способ реализовать класс машины состояний в python? - PullRequest
0 голосов
/ 20 июня 2019

Какой самый понятный способ реализовать класс, подобный описанному ниже:

A Widget объект всегда находится в одном из небольшого числа состояний. Например, может быть 2 состояния или 3 состояния, но не более 5 состояний. A Widget object, независимо от того, в каком состоянии он находится, всегда имеет одинаковые сигнатуры методов. Например, если виджет имеет метод с именем bar, то всегда есть метод bar независимо от того, находится ли объект в состоянии 0, состоянии 1, состоянии 2 и т. Д. Однако внутренняя реализация bar отличается в зависимости от того, в каком состоянии находится Widget. Вызов метода bar также может изменить состояние, в котором находится объект.

Я придумал реализацию, но, на мой взгляд, это ужасно. Буду признателен за альтернативы.

class WidgetState0:
    def __init__(counter):
        self._counter = counter
    def bar(in_signal):
        print("state 0 bar() is happening")
        self._counter += 1
        out_signal = in_signal
        out_state = WidgetState1(self._counter)
        return out_signal, out_state 
class WidgetState1:
    def __init__(counter):
        self._counter = counter
    def bar(in_signal):
        print("state 1 bar() is happening")
        out_signal = 11111
        out_state = WidgetState0(self._counter)
        return out_signal, out_state 
class Widget:
    def __init__():
        self._state = WidgetState1(0) 
    def bar(in_signal):
        out_signal, next_state = self._core.bar(in_signal)
        self._state = next_state 
        return out_signal

Один вариант, который мне кажется хуже, показан ниже:

class Widget:
    def __init__():
        self._state_flag = 0 
    def bar(input)
        if self._state_flag == 0:
            return self.barstate0(input)
        elif self._state_flag == 1:
            return self.barstate1(input)
        elif self._state_flag == 2:
            return self.barstate2(input)
        # etc...    
...