Python transitions(状态机)模块学习笔记
实验设计:
模拟水(h2o)的三种状态[固态(solid),液态(liquid),气态(gas)]的相互转换
实现功能:
- 初始化时可以设定初始状态(温度),根据温度自动设置初始状态
- 对外提供两个方法:加热(heat)和冷却(cool),可以出发状态转换
- 每次加热和冷却的温度可以动态设置,只有满足状态转换条件才发生状态转换
代码实践:
基础——简单状态转换
直接调用触发器,触发状态变换,不进行逻辑判断
实现步骤:
- 创建一个类实例(h2o)
- 创建状态列表(states)
- 创建状态转换器列表(transitions)
- 创建状态机实例(machine)
- 调用状态转换器触发状态转换
代码示例:
from transitions import Machine
class H2o(object):
pass
h2o = H2o()
states=['solid', 'liquid', 'gas']
transitions = [
{
'trigger': 'melt', 'source': 'solid', 'dest': 'liquid'},
{
'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas'},
{
'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas'}
]
machine = Machine(h2o, states=states, transitions=transitions, initial='liquid')
print(h2o.state)
print(h2o.evaporate())
print(h2o.state)
进阶——条件转换
引入温度Temp变量,对外暴露加热(heat)和冷却(cool)接口,当温度变化后达到状态变化条件时才触发状态变换
实现思路:
- 在H2o中增加属性temp,用户维护温度信息
- 状态转换器不对外暴露,外部不能直接触发状态转换
- 对外暴露的接口为加热(heat)和冷却(cool),通过事后温度触发状态转换
- 状态定义:{‘gas’: <=0, ‘liquid’: (0,100], ‘gas’: >100}
代码示例:
import random
from transitions import Machine
class H2o(object):
def __init__(self, initTemp=10):
self.temp = initTemp
if s