[英]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)
你可以使它更紧凑,但不像你想要的那样紧凑。 问题是有两个不兼容的需求:
_parent
的赋值必须位于方法体内(例如__init__
),因为它必须在实例上设置。 另一个复杂因素是没有办法做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.