You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:39:32