Python实现简单状态框架的方法
作者:chongq 时间:2022-08-20 14:13:44
本文实例讲述了Python实现简单状态框架的方法。分享给大家供大家参考。具体分析如下:
这里使用Python实现一个简单的状态框架,代码需要在python3.2环境下运行
from time import sleep
from random import randint, shuffle
class StateMachine(object):
''' Usage: Create an instance of StateMachine, use set_starting_state(state) to give it an
initial state to work with, then call tick() on each second (or whatever your desired
time interval might be. '''
def set_starting_state(self, state):
''' The entry state for the state machine. '''
state.enter()
self.state = state
def tick(self):
''' Calls the current state's do_work() and checks for a transition '''
next_state = self.state.check_transitions()
if next_state is None:
# Stick with this state
self.state.do_work()
else:
# Next state found, transition to it
self.state.exit()
next_state.enter()
self.state = next_state
class BaseState(object):
''' Usage: Subclass BaseState and override the enter(), do_work(), and exit() methods.
enter() -- Setup for your state should occur here. This likely includes adding
transitions or initializing member variables.
do_work() -- Meat and potatoes of your state. There may be some logic here that will
cause a transition to trigger.
exit() -- Any cleanup or final actions should occur here. This is called just
before transition to the next state.
'''
def add_transition(self, condition, next_state):
''' Adds a new transition to the state. The "condition" param must contain a callable
object. When the "condition" evaluates to True, the "next_state" param is set as
the active state. '''
# Enforce transition validity
assert(callable(condition))
assert(hasattr(next_state, "enter"))
assert(callable(next_state.enter))
assert(hasattr(next_state, "do_work"))
assert(callable(next_state.do_work))
assert(hasattr(next_state, "exit"))
assert(callable(next_state.exit))
# Add transition
if not hasattr(self, "transitions"):
self.transitions = []
self.transitions.append((condition, next_state))
def check_transitions(self):
''' Returns the first State thats condition evaluates true (condition order is randomized) '''
if hasattr(self, "transitions"):
shuffle(self.transitions)
for transition in self.transitions:
condition, state = transition
if condition():
return state
def enter(self):
pass
def do_work(self):
pass
def exit(self):
pass
##################################################################################################
############################### EXAMPLE USAGE OF STATE MACHINE ###################################
##################################################################################################
class WalkingState(BaseState):
def enter(self):
print("WalkingState: enter()")
def condition(): return randint(1, 5) == 5
self.add_transition(condition, JoggingState())
self.add_transition(condition, RunningState())
def do_work(self):
print("Walking...")
def exit(self):
print("WalkingState: exit()")
class JoggingState(BaseState):
def enter(self):
print("JoggingState: enter()")
self.stamina = randint(5, 15)
def condition(): return self.stamina <= 0
self.add_transition(condition, WalkingState())
def do_work(self):
self.stamina -= 1
print("Jogging ({0})...".format(self.stamina))
def exit(self):
print("JoggingState: exit()")
class RunningState(BaseState):
def enter(self):
print("RunningState: enter()")
self.stamina = randint(5, 15)
def walk_condition(): return self.stamina <= 0
self.add_transition(walk_condition, WalkingState())
def trip_condition(): return randint(1, 10) == 10
self.add_transition(trip_condition, TrippingState())
def do_work(self):
self.stamina -= 2
print("Running ({0})...".format(self.stamina))
def exit(self):
print("RunningState: exit()")
class TrippingState(BaseState):
def enter(self):
print("TrippingState: enter()")
self.tripped = False
def condition(): return self.tripped
self.add_transition(condition, WalkingState())
def do_work(self):
print("Tripped!")
self.tripped = True
def exit(self):
print("TrippingState: exit()")
if __name__ == "__main__":
state = WalkingState()
state_machine = StateMachine()
state_machine.set_starting_state(state)
while True:
state_machine.tick()
sleep(1)
希望本文所述对大家的Python程序设计有所帮助。
标签:Python,状态,框架,方法
0
投稿
猜你喜欢
SQL Server作业报错特殊案例分析
2024-01-15 17:33:02
Golang中time.After的使用理解与释放问题
2024-04-25 13:20:08
Python中shape计算矩阵的方法示例
2022-04-09 20:34:06
解决Vue axios post请求,后台获取不到数据的问题方法
2024-05-09 09:38:38
JavaScript导出Excel实例详解
2023-09-06 15:51:27
详解Python中使用base64模块来处理base64编码的方法
2022-01-12 01:27:19
Linux服务器网卡流量查看方法 shell和Python各一枚
2023-10-07 09:31:19
ASP技巧:禁用清除页面缓存的五种方法
2009-07-21 12:33:00
使用SpringBoot + Redis 实现接口限流的方式
2023-07-11 00:06:49
Go http请求排队处理实战示例
2024-05-21 10:26:58
图书管理系统的sqlserver数据库设计示例
2024-01-18 08:50:50
python中使用smtplib和email模块发送邮件实例
2022-09-16 05:37:23
Python如何使用pymongo连接MongoDB数据库并进行相关操作
2023-05-12 01:21:49
分别用两个函数实现的菜单
2024-04-19 10:05:36
深入JDBC sqlserver连接写法的详解
2024-01-19 12:47:28
Django中URL的参数传递的实现
2022-12-24 13:53:25
Python 动态变量名定义与调用方法
2023-07-29 22:36:05
Python的type函数结果你知道嘛
2023-01-07 11:33:51
javascript中的throttle和debounce浅析
2024-05-08 10:10:27
图解Golang的GC垃圾回收算法
2023-07-12 23:25:45