私はFysom
を使用してPythonで有限状態マシンを作成していますが、なぜ起こっているのか分かりません。クラス内からFysomを初期化する前に状態コールバック関数が呼び出されています
私はMyClass
クラスを作成し、このクラスの中にFysom
のインスタンスであるself.fsm
メンバーを作成します。
何らかの理由で、fsm
メンバーが、有限状態マシンの最初の状態に達したときに、存在しないようです。しかし、第2の状態に達すると、それは存在する。
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()
そして、これが出力されます:
state: start
self attrs: {}
event: go
state: end
self attrs: {'fsm': <fysom.Fysom object at 0x7fe948f11510>}
初期状態(start
)が到達したときMyClass
のfsm
メンバーが存在しないのはなぜ?クラスコンストラクタ__init__
で作成して初期化する必要はありませんか?
私の推測では、Fysom
インスタンスが作成されるとき、それはfsm
メンバーに割り当てられている前(有限状態マシンの初期状態のためのコールバックです)on_start_callback
がアクセスしようとしたときに、したがって、それが失敗した、と呼ばれているということですself.fsm
。 これは実際に起こることであり、正しい動作ですか?
が、私は何もしない初期状態を作成することで、その問題の回避策を発見した(あるいは少なくともそれがすべてでself
にアクセスしていない)、その後main
機能から、私は手動で本物に遷移イベントをトリガself
にアクセスする初期状態(その時点で既に定義されています)。
正しい、この答えははるかに複雑、それは必要以上にですが。 – jsbueno
答えは、このフレーズよりも多少なりともあります。「fsmを作成するときに、fsmが作成されて添付される前にオブジェクトの辞書を表示するコールバックがあります。 – jsbueno
'self.fsm.initialize()'行を追加すると、このエラーが発生します: 'AttributeError: 'Fysom'オブジェクトには 'initialize'属性がありません。あなたはその行を追加することで何を達成しようとしていましたか? –