2014-05-19 103 views
0

我的代碼是由一個隊列線程類(稱爲MyThread),一類繼承MyThread(設備)和多類繼承Device(如AB,...)線程,繼承

Device實例化一個FSM(狀態機)。因此每個設備(AB,..)具有相同的FSM表。

現在我想實現在每個設備AB,用於/密克羅尼西亞的回調...

這裏是我的代碼草圖:

1.Device模塊:

MAP = { 
'initial' : 'none', 
'events': [ 
    {'name': 'load', 'src': ['OFF', 'ON', 'none'], 'dst': 'LOADED'}, 
    ], 
'callbacks': {} 
} 
class Device(MyThread): 
    def __init__(self, actor=None): 
     MyThread.__init__(self, actor, self.__class__) 
     self.MAP =MAP 
     self.MAP['callbacks']['onload'] = lambda e: self.initialise() 
     self.start() 
    def startFSM(self): 
     self.started = True 
     self.fsm = Fysom(self.MAP) 
     self.fsm.startup() 

2.MyThread模塊:

class MyThread(threading.Thread): 
    def __init__(self, actor, name): 
     threading.Thread.__init__(self, name=name) 
     self.actor = actor 
    def run(self): 
     pass 

3.A:

class A(Device):  
    def __init__(self, actor=None): 
     Device.__init__(self, actor) 
     self.status = None 
    def initialise(self): 
     print "Here is A" 

4.B:

class B(Device):  
    def __init__(self, actor=None): 
     Device.__init__(self, actor) 
     self.status = None 
    def initialise(self): 
     print "Here is B" 

當前代碼簡化:

a = A() 
b = B() 
a.fsm.load() 
b.fsm.load() 

這將返回:

Here is B 
Here is B 

代替:

Here is A 
Here is B 

或再次: a.MAP['callbacks']['onload']已爲b.MAP['callbacks']['onload']

的這裏點是把重點放在MAP相同的內存位置屬性。問題是在self.MAP['callbacks']['onload']中保存的功能會覆蓋最後一個。但基本上他們應該有每個設備一個MAP(A,B,...)。並且每個設備應該保存自己的initialise方法到他自己的MAP屬性中。

回答

4

的問題是在這裏:

MAP = { 
'initial' : 'none', 
'events': [ 
    {'name': 'load', 'src': ['OFF', 'ON', 'none'], 'dst': 'LOADED'}, 
    ], 
'callbacks': {} 
} 
class Device(MyThread): 
    def __init__(self, actor=None): 
     MyThread.__init__(self, actor, self.__class__) 
     self.MAP =MAP # Problem! 

你正在做一個self.MAP參考MAP。因此,從Device繼承的類的每個實例都以self.MAP屬性結尾,該屬性引用完全相同的字典(全球MAP字典)。你真正想要的是什麼,讓每個實例都有自己的字典:

from copy import deepcopy 

MAP = { 
'initial' : 'none', 
'events': [ 
    {'name': 'load', 'src': ['OFF', 'ON', 'none'], 'dst': 'LOADED'}, 
    ], 
'callbacks': {} 
} 
class Device(MyThread): 
    def __init__(self, actor=None): 
     MyThread.__init__(self, actor, self.__class__) 
     self.MAP = deepcopy(MAP) # Make sure each MAP is unique. 
+1

我認爲你需要做'MAP'字典的深層副本以其他方式將共享內容的副本 - 其中許多是容器本身。另一種可能性是創建一個Map類,併爲每個「Device」創建新的實例。 – martineau

+0

@mertineau是的,你是對的。我會更新答案。 – dano

+0

ty尋求幫助。我嘗試過但沒有任何改變。如果我做'a.MAP ['callbacks'] ['onload'] = 0',它也會覆蓋'b.MAP ['callbacks'] ['onload']'。我想知道它是不是由於polymorphisme。 – Katsu