相互参照的酸洗对象

2024-10-03 02:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个Python类,StudentEvent,和StudentEvent。你知道吗

为简单起见:

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_dictstudentevents_dict。你知道吗

好吧,我能做到。但是,如果我以后取消词典的pickle,那么studentevents_dict中的学生和事件将不会引用StudentsEvents中相同的students_dictevents_dict,对吗?你知道吗

如果我稍后修改对象,例如,在Event对象中填充关联的StudentEvents列表,这可能会有问题,因为StudentEvent引用的事件不会是events_dict中具有相同id的Event。你知道吗


Tags: selfeventid字典initdefeventsstudent
1条回答
网友
1楼 · 发布于 2024-10-03 02:34:04

正确。如果需要保留对象之间的指针关系,则必须将它们合并到一个元组中。这里我使用dill而不是pickle,但是效果应该是一样的。这适用于类实例(如图所示)、dict或其他情况。你知道吗

>>> 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>

相关问题 更多 >