所以我想寫一個狀態機類,就像下面編寫獨特的功能使用相同的參數
from states import StateMachineExample
sm = StateMachineExample()
while True:
a = input_source1()
b = input_source2()
c = input_source2()
sm.tick(a,b,c)
的StateMachine要跟蹤的狀態,並且所有用戶所要做的就是給它餵食每個循環的新輸入使用tick()
。類定義是類似以下內容:
class StateMachineBase(object):
__metaclass__ = ABCMeta
def __init__(self,init_state):
self._state = init_state
def tick(self,*args):
"""
Let the state machine process the next set of inputs.
"""
# The next state is defined by what the current state's
# function returns
newstate = self._state(*args) or self._state
self._state = newstate
class StateMachineExample(StateMachineBase):
def __init__(self):
super(StateMachineExample,self).__init__(self,self.StateA)
def StateA(a,b,c):
if condition_on(a,b,c):
return self.StateB # Transition to StateB
else:
return self.StateA
def StateB(a,b,c):
if other_condition_on(a,b,c):
return self.StateA
else:
return self.StateB
問題
反正是有避免必須明確說明a,b,c
參數爲每個功能(狀態)定義在StateMachineExample類?即是否有可能在一個地方定義參數並定義了一整套函數的參數?我意識到這整個實現可能是有缺陷的,所以我肯定會接受不同的方法。
注意
這是可能做到這一點與*args
但隨後的參數具有相對於Args tuple中被引用。我希望能夠在功能中按名稱引用參數,即a,b,c
。
我發現的最接近的解決方案是將輸入定義爲類成員變量,每次調用tick()
時都可以更新它們。我希望有比這更優雅的東西。
爲什麼要通過代碼而不是數據定義狀態機? –
@ IgnacioVazquez-Abrams你能詳細說明一下嗎?該類的重點是允許抽象在解釋時定義的狀態機的細節。如果有幫助,本例中的狀態機可以識別並細分視頻源中的一隻手。因此(粗略地說)每個週期的輸入是來自照相機饋送的圖像。然後用戶可以檢查類實例以查看狀態機當前是否正在跟蹤手並檢索諸如手的邊界框之類的相關屬性。 – toes