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 相关文章推荐
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
Python单例模式实例详解
Mar 01 Python
python使用arcpy.mapping模块批量出图
Mar 06 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
django admin后台添加导出excel功能示例代码
May 15 Python
Django urls.py重构及参数传递详解
Jul 23 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 Python
python语言的优势是什么
Jun 17 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
php+mysql事务rollback&commit示例
2010/02/08 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
微信红包随机生成算法php版
2016/07/21 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
php微信开发之关注事件
2018/06/14 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
python将ip地址转换成整数的方法
2015/03/17 Python
让Python代码更快运行的5种方法
2015/06/21 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
教师队伍管理制度
2014/01/14 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
护林员个人总结
2015/03/04 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
Python实现批量自动整理文件
2022/03/16 Python