Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用弱引用的正确方法_Python_Weak References - Fatal编程技术网

在Python中使用弱引用的正确方法

在Python中使用弱引用的正确方法,python,weak-references,Python,Weak References,我有两个班:父母班和孩子班。在任何时间点,只有一个父对象,但可以有多个子对象。父对象将需要在按子对象名称索引的字典中保留对子对象的引用。子级还需要对父级的引用,因为它可以调用父级的函数之一 我知道我应该在这里使用weakref。我有两种方法: 方法一 class Child(): def __init__( self, parent, name ): self.parent_ = weakref.proxy( parent ) self.name_ = n

我有两个班:父母班和孩子班。在任何时间点,只有一个父对象,但可以有多个子对象。父对象将需要在按子对象名称索引的字典中保留对子对象的引用。子级还需要对父级的引用,因为它可以调用父级的函数之一

我知道我应该在这里使用weakref。我有两种方法:

方法一

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

    您的两种方法是等效的,它们的评估结果完全相同

    当您希望垃圾收集引用的对象时,即使您的(弱)引用仍然存在,也会使用弱引用。在您的例子中,您的
    父对象
    定期引用您的
    子对象
    实例,但子对象仅对其公共父对象进行弱引用。这意味着,在某些情况下,即使仍然有孩子想要使用它,也会对父对象进行垃圾收集


    我想,您可以在这里使用一个常规的、有力的参考。

    回答您的问题:

  • 方法1和2是等效的
  • 通常,不需要直接调用
    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?我可能误解了你的问题,但你强烈表示,如果有孩子,父母需要在场。我推断只要有孩子,父母就不能被垃圾收集。明白吗。谢谢