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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
Python自动化构建工具scons使用入门笔记
Mar 10 Python
python中学习K-Means和图片压缩
Nov 20 Python
Python3 操作符重载方法示例
Nov 23 Python
Python中常用的内置方法
Jan 28 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
详解python播放音频的三种方法
Sep 23 Python
Python numpy线性代数用法实例解析
Nov 15 Python
python中return如何写
Jun 18 Python
python 多线程共享全局变量的优劣
Sep 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中使用全局变量的几种方法
2013/06/24 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
基于python的Paxos算法实现
2019/07/03 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
乔迁宴答谢词
2014/01/21 职场文书
总经理司机职责
2014/02/02 职场文书
三年级评语大全
2014/04/23 职场文书
小学家长学校培训材料
2014/08/24 职场文书
地理科学专业自荐信
2014/09/01 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书