在Python中使用弱引用的正确方法
我有两个班:父母班和孩子班。在任何时间点,只有一个父对象,但可以有多个子对象。父对象将需要在按子对象名称索引的字典中保留对子对象的引用。子级还需要对父级的引用,因为它可以调用父级的函数之一 我知道我应该在这里使用weakref。我有两种方法: 方法一在Python中使用弱引用的正确方法,python,weak-references,Python,Weak References,我有两个班:父母班和孩子班。在任何时间点,只有一个父对象,但可以有多个子对象。父对象将需要在按子对象名称索引的字典中保留对子对象的引用。子级还需要对父级的引用,因为它可以调用父级的函数之一 我知道我应该在这里使用weakref。我有两种方法: 方法一 class Child(): def __init__( self, parent, name ): self.parent_ = weakref.proxy( parent ) self.name_ = n
class Child():
def __init__( self, parent, name ):
self.parent_ = weakref.proxy( parent )
self.name_ = name
class Parent():
def __init__( self ):
self.children = {}
def createChild( self, name ):
self.children[ name ] = Child( self, name )
方法二
class Child():
def __init__( self, parent, name ):
self.parent_ = parent
self.name_ = name
class Parent():
def __init__( self ):
self.children = {}
def createChild( self, name ):
self.children[ name ] = Child( weakref.proxy( self ), name )
编辑:当父项死亡时,子项也应死亡。如果父对象不存在,我不希望任何子对象存在。这里真的需要弱引用吗?如果你用你的方法一只
self.parent = parent
你会达到你想做的。如果父对象不再在任何地方被强引用,对父对象的弱引用将允许父对象被销毁,但在这种情况下,子对象将无法调用父对象的函数,因为该对象将不存在
方法1和2在我看来是一样的
R您的两种方法是等效的,它们的评估结果完全相同 当您希望垃圾收集引用的对象时,即使您的(弱)引用仍然存在,也会使用弱引用。在您的例子中,您的
父对象
定期引用您的子对象
实例,但子对象仅对其公共父对象进行弱引用。这意味着,在某些情况下,即使仍然有孩子想要使用它,也会对父对象进行垃圾收集
我想,您可以在这里使用一个常规的、有力的参考。回答您的问题:
weakref.proxy()
。在这种情况下,您可以使用,它是:registry = weakref.WeakValueDictionary()
class Child():
def __init__(self, parent, name):
self.parent = parent
self.name = name
class Parent():
def __init__(self):
pass
def createChild(self, name):
child = Child(self, name)
registry[child] = self
顺便说一句,
Child
和Parent
这两个名称在这里有点混淆——按照惯例,它们意味着Child
继承自Parent
(在这种情况下,您可以直接对子对象调用父对象的方法,而不需要“子对象”知道父对象的名称)。你这里的是一种有一种关系,而不是一种是一种关系。很抱歉,我没有把问题说清楚。没有父母,孩子就不可能存在。如果是这样,那么弱引用就不合适了。用普通的、有力的证明来代替。为什么是Richard?我可能误解了你的问题,但你强烈表示,如果有孩子,父母需要在场。我推断只要有孩子,父母就不能被垃圾收集。明白吗。谢谢