【发布时间】:2015-04-07 19:22:25
【问题描述】:
这是我在 Python 中简单实现有限状态机的代码。我已经多次运行它无济于事。当各个状态类确实从各个类继承时,它们无法访问运行机器逻辑所需的食物和睡眠变量。我相信我得到了一个 KeyError,因为每次我添加一个新状态时,它都会将当前状态值重置为无。我该如何解决这个错误?有没有更好/正确的方法来组织我的课程?我在 python 方面处于中级水平,但是 OOP 概念对我来说尤其具有挑战性。任何帮助和建议将不胜感激!
class FSM():
def __init__(self):
self.states = {}
self.c_state = None
def update(self):
self.states[self.c_state].execute()
def addState(self, name, handler):
self.states[name] = handler
def startState(self, state):
self.c_state = state
def changeState(self, newstate):
print('The current state is:', self.c_state)
self.states[self.c_state].exit()
self.c_state = self.states[newstate]
self.states[self.c_state].enter()
class individual():
def __init__(self, name, food, sleep):
self.name = name
self.food = food
self.sleep = sleep
self.fsm = FSM()
class wander(individual):
def enter(self):
print('Entering Wander State')
def execute(self):
print('WANDERING')
if self.sleep == 0:
self.fsm.changeState('SLEEP')
elif 25 > self.sleep > 0 and self.food > 25:
self.fsm.changeState('WANDER')
self.sleep -= 5
self.food -= 5
elif self.food < 25:
self.fsm.changeState('EAT')
def exit(self):
print('Leaving Wander State')
class eat(individual):
def enter(self):
print('Entering Eating State')
def execute(self):
print('EATING')
if self.sleep > 0 and self.food < 25:
self.fsm.changeState('EAT')
self.food += 5
self.sleep -= 5
elif self.food > 25 and self.sleep > 0:
self.fsm.changeState('WANDER')
elif self.sleep == 0:
self.fsm.changeState('SLEEP')
def exit(self):
print('Exiting Eating State')
class sleep(individual):
def enter(self):
print('Entering Sleeping State')
def execute(self):
print('SLEEPING')
if 50 > self.sleep > 0:
self.fsm.changeState('SLEEP')
self.sleep += 5
elif self.sleep == 50 and self.food < 25:
self.fsm.changeState('EAT')
elif self.sleep == 50 and self.food > 25:
self.fsm.changeState('WANDER')
def exit(self):
print('Exiting Sleeping State')
aaron = individual('aaron', 10, 30)
aaron.fsm.addState('WANDER', wander(aaron.name, aaron.food, aaron.sleep))
aaron.fsm.addState('EAT', eat(aaron.name, aaron.food, aaron.sleep))
aaron.fsm.addState('SLEEP', sleep(aaron.name, aaron.food, aaron.sleep))
aaron.fsm.startState('WANDER')
print(aaron.fsm.c_state)
aaron.fsm.update()
File "C:/Users/Aaron/PycharmProjects/InDepthFSM/FSM.py", line 12, in update
self.states[self.c_state].execute()
File "C:/Users/Aaron/PycharmProjects/InDepthFSM/FSM.py", line 50, in execute
self.fsm.changeState('EAT')
File "C:/Users/Aaron/PycharmProjects/InDepthFSM/FSM.py", line 24, in changeState
self.states[self.c_state].exit()
KeyError: None
【问题讨论】: