2015-10-23 76 views
1

我需要經驗豐富的程序員的建議,因爲我無法圍繞這一點進行思考。 我有以下數據結構。在更改共享子對象時更新對象中的元數據

class obj(object): 
    def __init__(self, data=[], meta=[]): 
     self.data=data 
     self.meta=meta 

class subobj(object): 
    def __init__(self, data=[]): 
     self.data=data 

說,我從它創建以下對象。

sub1=subobj([0,1,5]) 
sub2=subobj([0,1,6]) 
sub3=subobj([0,1,7]) 
objA=obj(data=[sub1,sub2], meta=[3,3]) 
objB=obj(data=[sub3,sub1], meta=[3,3]) 

現在我改變sub1對第二個對象以及它的元數據進行操作。 爲了簡化,我通過obj在這裏寫這裏。瓦爾沒有二傳手/ getter方法:現在

objB.data[1].data+=[10,11] 
objB.meta[1]=5 

objA.data[0]有(明顯)改變。但objA.meta[0]保持不變。我想要在objA.data(在objB.data中引起)中的值更改之後立即觸發一些func(objB.meta[1]),並且還要更改objA.meta。重要提示:此func()使用來自objB的已更改sub1的元數據。

我根本不知道如何讓每一個obj知道所有其他obj s表示共享相同subobj因爲它。我可以讓func()在知道知道壁架後觸發。我會很感激任何提示。

注:

  1. 我想通過沒有元數據那些subobj各地obj小號之間,讓他們通過這些OBJ文件進行更改。元數據應該存儲在objs中定義的信息,而不是subobj。因此,func()的值取決於obj本身,但其定義與class obj的所有obj相同。

  2. 爲簡單起見,這個func(metadata)可以是類似multiply3(metadata)

  3. 我將有成千上萬的這些對象,所以我正在尋找一種相當抽象的解決方案,它不受少量對象的限制。

在當前的設計中可能嗎?我失去了如何實現這一點。

+0

嗯,你的子對象除了'data'還有其他屬性嗎?在你的例子中,你修改了子對象的'.els'屬性。 – ppperry

+0

如果您希望在子對象的屬性更改時通知父對象,則可以使用事件,並讓父對象在構造函數中訂閱其子事件。查看http://python-utilities.readthedocs.org/en/latest/events.html以查看它是否符合您的需求。 – user2085282

+0

對不起。我只是以更清晰的方式重寫。它只是'objB.data [1] .data + = [10,11]'。 'subobj's只是爲了保存由不同「父」對象更新的數據。但他們本身就是對象。 – AVX

回答

1

假設obj s'data屬性只能包含subobjs並且永遠不能更改,此代碼應該工作。

class obj(object): 
    __slots__=("data","meta") 
    def __init__(self,data=(),meta=None): 
     meta = meta or [] 
     self.data = data 
     self.meta = meta 
     for so in data: 
      so._objs_using.append(self) 
class subobj(object): 
    __slots__ = ("_data","_objs_using") 
    def __init__(self,data=()): 
     self._objs_using=[] 
     self._data = data 
    @property 
    def data(self): 
     return self._data 
    @data.setter 
    def data(self,val): 
     self._data = val 
     for obj in self._objs_using: 
      metadata_changed(obj.meta) 

我打電話給你想調用元數據metadata_changed的函數。這項工作通過跟蹤objs的列表,每個subobj被使用,然後創建一個特殊的data屬性,每當它發生變化時通知每個obj