在Fysom初始化之前从类内部调用状态回调函数

2024-10-02 08:21:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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)时,MyClassfsm成员不存在?不应在类构造函数__init__处创建和初始化?在

我的猜测是,on_start_callback(这是有限状态机初始状态的回调)在创建Fysom实例时被调用,并且在它被分配给fsm成员之前被调用,因此它在尝试访问self.fsm时失败。这是真的吗?这是正确的行为吗?

我已经找到了解决这个问题的方法:创建一个什么都不做的初始状态(或者至少它根本不访问self),然后从main函数手动触发转换到实际初始状态的事件,该初始状态确实访问了self(此时已经定义)。在


Tags: selfeventmainondefcallbackmyclass成员
1条回答
网友
1楼 · 发布于 2024-10-02 08:21:59

你猜是对的,这是正确的行为。__init__按顺序执行。您的回调发生在fsm创建时,在它被分配给self.fsm之前,因此self.__dict__仍然是空的。在

成功实例化并分配fsm后,可以在__init__中初始化它:

class MyClass(object):
    def __init__(self):
        self.fsm = Fysom({
            'initial': 'none',
            'events': [
                { 'name': 'initialize', 'src': 'none', 'dst': 'start'},
                { '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
            }
        })
        self.fsm.initialize()

相关问题 更多 >

    热门问题