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使用Socket(Https)Post登录百度的实现代码
May 18 Python
python实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
Python中使用dom模块生成XML文件示例
Apr 05 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
Python之os操作方法(详解)
Jun 15 Python
手把手教你使用Python创建微信机器人
Apr 29 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 Python
如何使用Python实现一个简易的ORM模型
May 12 Python
Python函数中的不定长参数相关知识总结
Jun 24 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 和 XML: 使用expat函数(二)
2006/10/09 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
js实现收缩菜单效果实例代码
2013/10/30 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python脚本暴力破解栅栏密码
2015/10/19 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
python 迭代器和iter()函数详解及实例
2017/03/21 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
远程调用的原理
2014/07/05 面试题
企业总经理任命书
2014/06/05 职场文书
网络销售员岗位职责
2015/04/11 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书