python状态机transitions库详解


Posted in Python onJune 02, 2021

一、简介

 transitions库

pip install transitions

状态机

state:状态节点

transition:用于从一个状态节点移动到另一个状态节点

教程

https://pypi.org/project/transitions/

二、逐步创建

创建对象

创建一个继承object的类Number的实体对象number,然后调用transitions.Machine()将状态机绑定到这个实体对象上。

from transitions import Machine

class Number(object):
    pass
    
number = Number()
machine = Machine(model=number)

然后我们得到了两个东西,一个是状态机machine,一个是具体的实体对象number,。
之后设定状态机是用machine,运行状态机是用具体的实体对象number

添加state

state可以指定:

  • name:状态节点的名字,必须指定。
  • on_enter:进入该状态节点会产生的事件(注意,初始节点不会调用,因为已经进入了。见【验证代码】)
  • on_exit:退出该状态节点会产生的事件
'''
构造简单的state
'''
# 只指定名字
zero = '0'

# 通过State()
from transitions import State
one = State('1')

# 构造字典
two = {'name':'2'}
'''
构造复杂的State
'''
class Number(object):
    def hello(self):
        print('hello')
    pass

zero = '0'


from transitions import State
one = State('1', on_enter=['hello'], on_exit=['hello'])


two = {'name':'2', 'on_enter':['hello'], 'on_exit':['hello']}
'''
添加state
'''
# 逐个
machine.add_states(zero)

# 一起添加
machine.add_states([one, two])

添加transition

transition需要指定三个东西:

  • trigger:表示transition的名字(注意,不能和Number类中方法重名了)
  • source:原状态节点
  • dest:目标转态节点
machine.add_transition('zero_to_one', source='0', dest='1')    # 有效
machine.add_transition('zero_to_one', source='1', dest='2')    # 无效

注意,只有第一个匹配zero_to_one的transition有效。因此,上面最后一行中定义的转换不会做任何事情。

三、直接初始化创建

states = [
    {'name':'0'},
    {'name':'1'},
    {'name':'2', 'on_enter':['hello'], 'on_exit':['hello']},
]
# way1
transitions = [
    { 'trigger': 'zero_to_one', 'source': '0', 'dest': '1' },
    { 'trigger': 'zero_to_two', 'source': '0', 'dest': '2' },
    { 'trigger': 'one_to_two', 'source': '1', 'dest': '2' },
    { 'trigger': 'any_to_zero', 'source': '*', 'dest': '0' },   # 任意前状态 '*'
]

# way2
transitions = [
    ['zero_to_one', '0', '1' ],
    ['one_to_two', '1', '2' ],
    ['any_to_zero', '*', '0' ],    # 任意前状态 '*'
]
from transitions import Machine

class Number(object):
    def hello(self):
        print('hello')
    pass
    
number = Number()
machine = Machine(
	model=number, 
	states=states, 
	initial=states[0]['name'],
	transitions=transitions
)

四、运行

输出当前状态

now_state = number.state
print(now_state)

判断当前状态

格式:is_«state name»()。返回True False。

number.is_0()

强行移动状态

格式:to_«state name»()。返回True;如果移动到不存在的状态节点从而失败,那么抛出AttributeError

number.to_2()

获取到某个状态的transition

machine.get_triggers('0')
# ['to_0', 'to_1', 'to_2', 'zero_to_one', 'any_to_zero']

调用transition

# way 1
number.zero_to_one()

# way 2
number.trigger('zero_to_one')

附录

什么叫做初始状态已经进入

from transitions import Machine

class Number(object):
    def hello(self):
        print('hello')
    pass
number = Number()

states = [
    {'name':'0', 'on_enter':['hello']},
    {'name':'1'},
    {'name':'2'},
]
transitions = [
    { 'trigger': 'zero_to_one', 'source': '0', 'dest': '1' },
    { 'trigger': 'zero_to_two', 'source': '0', 'dest': '2' },
    { 'trigger': 'one_to_two', 'source': '1', 'dest': '2' },
    { 'trigger': 'any_to_zero', 'source': '*', 'dest': '0' },   # 任意前状态 '*'
]
Machine(model=number, states=states, initial=states[0]['name'],transitions=transitions)

init_state = number.state
print(init_state)				

number.zero_to_one()
print(number.state)

number.any_to_zero()			
print(number.state)
'''
0		# 第一次不会调用,因为已经进入了
1
hello	# 再进来时才调用
0
'''

到此这篇关于python进阶之状态机transitions库详解的文章就介绍到这了,更多相关python状态机transitions库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中的对象拷贝示例 python引用传递
Jan 23 Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
python简单程序读取串口信息的方法
Mar 13 Python
Python实现包含min函数的栈
Apr 29 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
用Python设计一个经典小游戏
May 15 Python
python实现本地图片转存并重命名的示例代码
Oct 27 Python
详解python中sort排序使用
Mar 23 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
Nov 16 Python
python 调用js的四种方式
Apr 11 Python
python爬取某网站原图作为壁纸
Python爬虫之自动爬取某车之家各车销售数据
从np.random.normal()到正态分布的拟合操作
golang特有程序结构入门教程
Jun 02 #Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 #Python
python之np.argmax()及对axis=0或者1的理解
Python import模块的缓存问题解决方案
Jun 02 #Python
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
php中数组最简单的使用方法
2020/12/27 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
微信小程序云开发之新手环境配置
2019/05/16 Javascript
VUE安装使用教程详解
2019/06/03 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
python中while循环语句用法简单实例
2015/05/07 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
python+logging+yaml实现日志分割
2019/07/22 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
哪些情况下不应该使用索引
2015/07/20 面试题
中科软笔试题和面试题
2014/10/07 面试题
职业生涯规划书结束语
2014/04/15 职场文书
授权委托书公证
2014/09/14 职场文书
学习作风建设心得体会
2014/10/22 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
详解pytorch创建tensor函数
2022/03/22 Python
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers