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正则表达式介绍
Aug 06 Python
解读Python编程中的命名空间与作用域
Oct 16 Python
Python之父谈Python的未来形式
Jul 01 Python
python编写微信远程控制电脑的程序
Jan 05 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
python实现推箱子游戏
Mar 25 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
Python_查看sqlite3表结构,查询语句的示例代码
Jul 17 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
Python Opencv图像处理基本操作代码详解
Aug 31 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 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
刚才在简化php的库,结果发现很多东西
2006/12/31 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
python自动裁剪图像代码分享
2017/11/25 Python
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
Python3多线程基础知识点
2019/02/19 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
互动出版网:专业书籍
2017/03/21 全球购物
护理专业应届毕业生推荐信
2013/11/15 职场文书
项目负责人任命书
2014/06/04 职场文书
经济国贸专业求职信
2014/06/18 职场文书
地球一小时活动总结
2015/02/27 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL
CSS3实现指纹特效代码
2022/03/17 HTML / CSS