2014-10-02 69 views
1

我有三個Python類,Student,EventStudentEvent酸洗互相引用的對象

爲了簡單:

class Student: 
    def __init__(self, id): 
     self.id = id 

class Event: 
    def __init__(self, id): 
     self.id = id 
     self.studentevents = [] 

class StudentEvent: 
    def __init__(self, student, event, id): 
     self.student = student 
     self.event = event 
     self.id = id 

我有這些類,我投入,我可以閱讀和分析詞典的情況下的千百萬之間。閱讀和創建對象需要很長時間,所以我想將它們醃製成3個字典,即students_dictevents_dict,studentevents_dict

所以,很好,我可以做到這一點。但是,如果我稍後再對字典進行醃製,studentevents_dict中的學生和事件將不會引用students_dictevents_dict中相同的StudentsEvents,對嗎?

如果我修改的對象在稍後的時間,例如,填充在Event對象關聯StudentEvents的列表中,因爲由StudentEvent引用的事件將不會是Event用相同的ID中,可能會出現問題events_dict

+0

對於大小的數據集,你可能要考慮切換到喜歡的SQLite數據庫。 – 2014-10-02 18:00:29

+0

對於我提出的情況,這肯定會更快,但是我已經隱藏了很多類方法和計算以及其他垃圾,我想從上述問題的定義中爲每個單獨對象保留這些內容酸洗彼此引用的物體。不過好的建議! – 2014-10-02 21:33:52

回答

2

正確。如果您需要保留對象之間的指針關係,則必須將它們在一個元組中一起醃製。這裏我使用的是dill而不是pickle,但效果應該是一樣的。這適用於類實例(如圖所示),字典或其他。

>>> class A: 
... def __init__(self, b): 
...  self.b = b 
... 
>>> class B: 
... pass 
... 
>>> import dill 
>>>   
>>> b = B() 
>>> a = A(b) 
>>> 
>>> f = open('_sed', 'wb') 
>>> dill.dump(({1:a},{2:b}), f) 
>>> f.close() 

再後來......

Python 2.7.8 (default, Jul 13 2014, 02:29:54) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import dill 
>>> f = open('_sed', 'rb') 
>>> t = dill.load(f) 
>>> f.close() 
>>> t 
({1: <__main__.A instance at 0x10906a440>}, {2: <__main__.B instance at 0x10906a830>}) 
>>> t[0][1].b 
<__main__.B instance at 0x10906a830>