Какой самый понятный способ реализовать класс, подобный описанному ниже:
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...