python状态机实现_如何实现Python状态机设计?
我不太明白這個(gè)問(wèn)題,State設(shè)計(jì)模式非常清楚。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()
這是非常常見(jiàn)的樣板,用于Java、C+、Python(當(dāng)然還有其他語(yǔ)言)。
如果你的狀態(tài)轉(zhuǎn)換規(guī)則碰巧是微不足道的,那么有一些優(yōu)化可以將轉(zhuǎn)換規(guī)則本身推送到超類中。
請(qǐng)注意,我們需要有前向引用,所以我們按名稱引用類,使用eval將類名轉(zhuǎn)換為實(shí)際的類,可以選擇的方法是使轉(zhuǎn)換規(guī)則實(shí)例變量代替類變量,然后在定義所有類之后創(chuàng)建實(shí)例。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" }
在某些情況下,您的事件并不像測(cè)試對(duì)象一樣簡(jiǎn)單,所以更普遍的轉(zhuǎn)換規(guī)則是使用一個(gè)正確的函數(shù)對(duì)象對(duì)列表。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") ]
總結(jié)
以上是生活随笔為你收集整理的python状态机实现_如何实现Python状态机设计?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 域名与转发服务器ip指向不一致_域名映射
- 下一篇: 控制台下修改系统驱动状态的代码