2017-12-07 13 views
0

私は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)が到達したときMyClassfsmメンバーが存在しないのはなぜ?クラスコンストラクタ__init__で作成して初期化する必要はありませんか?

私の推測では、Fysomインスタンスが作成されるとき、それはfsmメンバーに割り当てられている前(有限状態マシンの初期状態のためのコールバックです)on_start_callbackがアクセスしようとしたときに、したがって、それが失敗した、と呼ばれているということですself.fsmこれは実際に起こることであり、正しい動作ですか?

が、私は何もしない初期状態を作成することで、その問題の回避策を発見した(あるいは少なくともそれがすべてでselfにアクセスしていない)、その後main機能から、私は手動で本物に遷移イベントをトリガselfにアクセスする初期状態(その時点で既に定義されています)。

答えて

1

あなたは正しいと思いますが、正しい動作です。 __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() 
+1

正しい、この答えははるかに複雑、それは必要以上にですが。 – jsbueno

+0

答えは、このフレーズよりも多少なりともあります。「fsmを作成するときに、fsmが作成されて添付される前にオブジェクトの辞書を表示するコールバックがあります。 – jsbueno

+0

'self.fsm.initialize()'行を追加すると、このエラーが発生します: 'AttributeError: 'Fysom'オブジェクトには 'initialize'属性がありません。あなたはその行を追加することで何を達成しようとしていましたか? –

関連する問題