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 多线程抓取图片效率对比
Feb 27 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
django表单实现下拉框的示例讲解
May 29 Python
Python实现拷贝/删除文件夹的方法详解
Aug 29 Python
Python subprocess库的使用详解
Oct 26 Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 Python
python做反被爬保护的方法
Jul 01 Python
django框架模板语言使用方法详解
Jul 18 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
python设置环境变量的作用整理
Feb 17 Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 Python
scrapy-splash简单使用详解
Feb 21 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将数据库导出成excel的方法
2010/05/07 PHP
跟我学Laravel之路由
2014/10/15 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
javascript绘制简单钟表效果
2020/04/07 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
python梯度下降法的简单示例
2018/08/31 Python
django 将model转换为字典的方法示例
2018/10/16 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
用Python进行websocket接口测试
2020/10/16 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
广州盈通面试题
2015/12/05 面试题
医学毕业生自荐信
2013/10/11 职场文书
社区学雷锋活动策划方案
2014/01/30 职场文书
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript