繁体   English   中英

在对象上使用weakref作为属性的更有效方法?

[英]A more efficient way to use a weakref on an object as a property?

我知道在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对象。 有没有更紧凑的方法来创建一个弱引用的对象,我可以作为属性而不是可调用的访问?

我为此使用weakref.proxy

import weakref

class A(object):
    def __init__(self, parent)
        self.parent = weakref.proxy(parent)

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

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

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

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

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是一个属性生成器函数,它检索隐藏属性并调用它来访问弱引用对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM