4

我知道在 Python 中我可以执行以下操作:

from weakref import ref

class A(object):
    def __init__(self, parent):
        self._parent = ref(parent)

    @property
    def parent(self):
        return self._parent()

a = A(some_other_object)
print a.parent

在这种假设情况下,我创建了一个实例A并以一种很好的方式访问弱引用parent对象。不过,每个弱引用属性似乎有 4 行代码有点多。

我想我可以做如下的事情作为上述的捷径:

class A(object):
    def __init__(self, parent):
        self.parent = property(ref(parent))

但这不会返回父对象,而是返回一个property对象。有没有更紧凑的方法来创建一个弱引用对象,我可以将其作为属性而不是可调用对象访问?

4

2 回答 2

4

我为此使用了weakref.proxy

import weakref

class A(object):
    def __init__(self, parent)
        self.parent = weakref.proxy(parent)
于 2013-07-07T07:55:11.150 回答
0

你可以让它更紧凑一点,但不像你想要的那么紧凑。问题是有两个不兼容的需求:

  1. 的赋值_parent必须在方法体内(例如,__init__),因为它必须在实例上设置。
  2. 属性的创建不能在方法体内,因为属性只有在类上定义时才起作用。

另一个复杂情况是,没有办法让parent = somePropertyMaker(ref(x))函数somePropertyMaker“知道”它被分配给名称“父”。这意味着您必须显式传递该属性下的隐藏属性的名称。

考虑到这一点,您可以这样做:

def weakProp(hidden):
    @property
    def prop(self):
        return getattr(self, hidden)()
    return prop

class A(object):
    def __init__(self, parent):
        self._parent = ref(parent)

    parent = weakProp('_parent')

class B(object):
    pass

>>> b = B()
>>> a = A(b)
>>> print b
<__main__.B object at 0x00000000029D0470>
>>> print a.parent
<__main__.B object at 0x00000000029D0470>

weakProp是一个属性生成器函数,它检索隐藏属性并调用它来访问弱引用对象。

于 2013-07-07T07:54:22.617 回答