我的代碼是由一個隊列線程類(稱爲MyThread
),一類繼承MyThread
(設備)和多類繼承Device
(如A
,B
,...)線程,繼承
Device
實例化一個FSM(狀態機)。因此每個設備(A
,B
,..)具有相同的FSM表。
現在我想實現在每個設備A
,B
,用於/密克羅尼西亞的回調...
這裏是我的代碼草圖:
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屬性中。
我認爲你需要做'MAP'字典的深層副本以其他方式將共享內容的副本 - 其中許多是容器本身。另一種可能性是創建一個Map類,併爲每個「Device」創建新的實例。 – martineau
@mertineau是的,你是對的。我會更新答案。 – dano
ty尋求幫助。我嘗試過但沒有任何改變。如果我做'a.MAP ['callbacks'] ['onload'] = 0',它也會覆蓋'b.MAP ['callbacks'] ['onload']'。我想知道它是不是由於polymorphisme。 – Katsu