我使用Fysom
在Python中创建一个有限状态机,我看到了一个我不知道为什么会发生的问题。在
我创建了一个MyClass
类,在这个类中我创建了一个self.fsm
成员,它是Fysom
的实例。在
由于某些原因,当到达有限状态机的第一个状态时,类的fsm
成员似乎不存在。当第二个状态到达时,它确实存在。在
from fysom import Fysom
class MyClass(object):
def __init__(self):
self.fsm = Fysom({
'initial': 'start',
'events': [ { 'src': 'start', 'name': 'go', 'dst': 'end' } ],
'callbacks': {
# States callbacks
'onstart': self.on_start_callback,
'onend': self.on_end_callback,
# Events callbacks
'onbeforego': self.show_event
}
})
def on_start_callback(self, event):
print "state: start"
print "self attrs: {}".format(self.__dict__)
def on_end_callback(self, event):
print "state: end"
print "self attrs: {}".format(self.__dict__)
def show_event(_, event):
print "event: {}".format(event.event)
def main():
instance = MyClass()
instance.fsm.go()
if __name__ == "__main__":
main()
这是输出:
^{pr2}$当达到初始状态(start
)时,MyClass
的fsm
成员不存在?不应在类构造函数__init__
处创建和初始化?在
我的猜测是,on_start_callback
(这是有限状态机初始状态的回调)在创建Fysom
实例时被调用,并且在它被分配给fsm
成员之前被调用,因此它在尝试访问self.fsm
时失败。这是真的吗?这是正确的行为吗?
我已经找到了解决这个问题的方法:创建一个什么都不做的初始状态(或者至少它根本不访问self
),然后从main
函数手动触发转换到实际初始状态的事件,该初始状态确实访问了self
(此时已经定义)。在
你猜是对的,这是正确的行为。
__init__
按顺序执行。您的回调发生在fsm创建时,在它被分配给self.fsm
之前,因此self.__dict__
仍然是空的。在成功实例化并分配fsm后,可以在
__init__
中初始化它:相关问题 更多 >
编程相关推荐