访问python容器的父对象

时间:2013-06-05 12:34:50

标签: python class object containers parent

我需要创建一个可以访问其子节点但也可以访问其父节点的容器。 这是一个我想如何做的简单例子:

import numpy as np
import gc


class Node(object):

    def __init__(self, name):
        self.parent = None
        self.child = []
        self.name = name
        self.mem_tracer = np.ones(10 ** 6)

    def append(self, obj):
        assert(isinstance(obj, Node))
        self.child.append(obj)
        obj.parent = self

但是,当我尝试删除节点时,我有一个内存问题(请注意,属性mem_tracer就在这里,以便能够看到对象是否已从内存中删除)

此代码显示问题(给出每行的内存状态):

print 'start'                    # 16.96Mb

a = Node('0')                    # 24.79Mb

a.append(Node('0/0'))            # 32.61Mb
a.append(Node('0/1'))            # 40.42Mb

a.child[0].append(Node('0/0/0')) # 48.24Mb
a.child[0].append(Node('0/0/1')) # 56.06Mb

a.child[1].append(Node('0/1/0')) # 63.87Mb
a.child[1].append(Node('0/1/1')) # 71.69Mb

del a.child[0]                   # 71.69Mb

gc.collect()                     # 48.24Mb

垃圾回收器无法收集已删除的对象,因为对它的引用仍存在于其子对象中(而它们不再被引用)。 我们可以在最后一行看到,对gc.collect的显式调用解决了这个问题,但我更愿意摆脱它,因为它非常耗时!

那么有没有其他方法来访问父容器而不是将其存储到属性中? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您有两种选择:

  • 手动删除obj.parent
  • 使用weakref保留对父级的伪引用。

有关weakref的详细信息,请参阅the docs