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实现Tab自动补全和历史命令管理的方法
Mar 12 Python
Python编写百度贴吧的简单爬虫
Apr 02 Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
tensorflow 使用flags定义命令行参数的方法
Apr 23 Python
如何利用python查找电脑文件
Apr 27 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
Python自动登录QQ的实现示例
Aug 28 Python
python 常见的反爬虫策略
Sep 27 Python
Python基础之Socket通信原理
Apr 22 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
用cookies来跟踪识别用户
2006/10/09 PHP
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
php Undefined index的问题
2009/06/01 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
JavaScript 加号(+)运算符号
2009/12/06 Javascript
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
python生成IP段的方法
2015/07/07 Python
Python paramiko模块的使用示例
2018/04/11 Python
儿童python练习实例
2018/05/27 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
python中嵌套函数的实操步骤
2019/02/27 Python
python lxml中etree的简单应用
2019/05/10 Python
python如何删除文件中重复的字段
2019/07/16 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
中间件分为哪几类
2012/03/14 面试题
晚会邀请函范文
2014/01/24 职场文书
《春天来了》教学反思
2014/04/07 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
golang使用map实现去除重复数组
2022/04/14 Golang
Vue操作Storage本地化存储
2022/04/29 Vue.js