第一篇,首先实现一个最简单的状态机。

  • 外部不直接修改状态机的state,而是向状态机发送一个event,让状态机内部自行计算新的state
  • 状态机内部维护一个状态转移表。key是event,value是目的状态
  • key以str表示,value以类常量表示
  • transit方法里接收事件作为参数,从transit_table里查找value,赋值给self.state字段
  • get_state方法返回self.state字段的值

PS:之前还以为类定义中可以直接使用RED、YELLOW这些名字访问类属性(毕竟是在class的作用域里),没相当不行。还是要加上StateMachine.前缀

class StateMachine(object):
	
	NULL   = 0
	RED    = 1
	YELLOW = 2
	GREEN  = 3

	def __init__(self):
		self.state = StateMachine.NULL
		self.transit_table = {
			'turn_red': StateMachine.RED,
			'turn_yellow': StateMachine.YELLOW,
			'turn_green': StateMachine.GREEN,
		}

	def transit(self, event):
		self.state = self.transit_table.get(event)

	def get_state(self):
		return self.state


if __name__ == '__main__':
	machine = StateMachine()
	machine.transit('turn_red')
	print(machine.get_state())
	machine.transit('turn_yellow')
	print(machine.get_state())
	machine.transit('turn_green')
	print(machine.get_state())