状态机 python_Python状态机设计
我真的不明白這個問題。設(shè)計模式非常清晰。請參閱Design Patterns book。class SuperState( object ):
def someStatefulMethod( self ):
raise NotImplementedError()
def transitionRule( self, input ):
raise NotImplementedError()
class SomeState( SuperState ):
def someStatefulMethod( self ):
actually do something()
def transitionRule( self, input ):
return NextState()
這是非常普通的樣板,用于爪哇、C++、Python(我也肯定其他語言)。
如果您的狀態(tài)轉(zhuǎn)換規(guī)則碰巧是微不足道的,那么有一些優(yōu)化可以將轉(zhuǎn)換規(guī)則本身推送到超類中。
注意,我們需要有前向引用,所以我們按名稱引用類,并使用eval將類名轉(zhuǎn)換為實際的類。另一種方法是生成轉(zhuǎn)換規(guī)則實例變量而不是類變量,然后在定義所有類之后創(chuàng)建實例。class State( object ):
def transitionRule( self, input ):
return eval(self.map[input])()
class S1( State ):
map = { "input": "S2", "other": "S3" }
pass # Overrides to state-specific methods
class S2( State ):
map = { "foo": "S1", "bar": "S2" }
class S3( State ):
map = { "quux": "S1" }
在某些情況下,您的事件不像測試對象的相等性那么簡單,因此更一般的轉(zhuǎn)換規(guī)則是使用正確的函數(shù)-對象對列表。class State( object ):
def transitionRule( self, input ):
next_states = [ s for f,s in self.map if f(input) ]
assert len(next_states) >= 1, "faulty transition rule"
return eval(next_states[0])()
class S1( State ):
map = [ (lambda x: x == "input", "S2"), (lambda x: x == "other", "S3" ) ]
class S2( State ):
map = [ (lambda x: "bar" <= x <= "foo", "S3"), (lambda x: True, "S1") ]
由于規(guī)則是按順序計算的,因此允許使用“默認”規(guī)則。
總結(jié)
以上是生活随笔為你收集整理的状态机 python_Python状态机设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# mongodb or查询_C# M
- 下一篇: 创造与魔法鲨鱼获得攻略 鲨鱼怎么捕捉