Python有限状态机(FSM)报错:'FSM'对象无'AddState'属性求助
解决你的FSM AttributeError问题
首先看你遇到的错误:AttributeError: 'FSM' object has no attribute 'AddState',这说明你的FSM类实例找不到AddState方法——最可能的原因是你写代码时缩进错误,把AddState(还有可能其他方法)放在了FSM类的外部,而不是作为类的成员方法。
先给你修正后的完整FSM类代码,确保所有方法都正确缩进在类内部:
class FSM(object): def __init__(self, character): self.char = character self.states = {} self.transitions = {} self.curState = None self.prevState = None self.trans = None def AddTransition(self, transName, transition): self.transitions[transName] = transition def AddState(self, stateName, state): self.states[stateName] = state def SetState(self, stateName): self.prevState = self.curState self.curState = self.states[stateName] def ToTransition(self, toTrans): self.trans = self.transitions[toTrans] def Execute(self): if (self.trans): self.curState.Exit() self.trans.Execute() self.SetState(self.trans.toState) self.curState.Enter() self.trans = None self.curState.Execute()
另外,我还发现你代码里的几个小问题,顺手帮你修正了,避免后续运行出问题:
CleanDishes类的Execute方法里,两行self.FSM.ToTransition没有加括号和目标状态参数,应该改成:def Execute (self): print "Cleaning dishes" if (self.startTime + self.timer <= clock()): if not (randint(1, 3) %2): self.FSM.ToTransition("toSleep") # 补充括号和参数 else: self.FSM.ToTransition("toVacuum") # 补充括号和参数Sleep类的__init__里重复定义了self.startTime = 0,会覆盖父类State初始化时的值,删掉这一行即可;- 主函数里的
startTime - clock()是笔误,应该改成startTime = clock()。
把这些地方修正后,你的有限状态机应该就能正常运行了。
内容的提问来源于stack exchange,提问作者JadstaSeven
相关产品推荐
相关产品推荐

