python状态机实现_如何实现Python状态机设计?

我不太明白这个问题,State设计模式非常清楚。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()

这是非常常见的样板,用于Java、C+、Python(当然还有其他语言)。

如果你的状态转换规则碰巧是微不足道的,那么有一些优化可以将转换规则本身推送到超类中。

请注意,我们需要有前向引用,所以我们按名称引用类,使用eval将类名转换为实际的类,可以选择的方法是使转换规则实例变量代替类变量,然后在定义所有类之后创建实例。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" }

在某些情况下,您的事件并不像测试对象一样简单,所以更普遍的转换规则是使用一个正确的函数对象对列表。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") ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值