0

弱引用可以用来传递复合对象的属性吗?假设您有一个具有属性 A 的类。您的代码的任何部分现在都可以获取对 A 的引用,但是如果由 A 组成的类实例被删除,则必须删除 A,但如果在其他地方引用它则不会。以对 A 的唯一强引用由组合对象拥有的方式来实现这种具有弱引用的行为是可以的吗?

class B:
 def __init__(self):
   self.A = SomeClass()
4

3 回答 3

1

弱引用用于避免保留实例,而不是确保在引用对象时删除对象。

只有当所有对它的强引用都被删除时,该SomeClass()实例才会内存中删除(任何不是弱引用的引用都是强引用)。

如果该B().A属性是对 的实例的唯一引用,那么当引用被重新绑定到其他对象或被清除SomeClass()时,该实例将被删除(如果被删除,该属性将自动被清除),因为引用计数下降到 0。B().AB()B().ASomeClass()

换句话说,如果B().A是对 的弱引用SomeClass(),并且没有其他对 的引用SomeClass(),则取消引用B().ANone改为返回,因为SomeClass()已经被删除。

但是,在外部使用弱引用可能是确保该实例成为该实例的唯一强引用的一种方式。B().AB().ASomeClass()

于 2013-07-28T21:53:24.223 回答
0

Python delete 将对象标记为可能删除并减少引用计数器 - 最终删除仅在引用计数器达到零时发生。

于 2013-07-28T19:01:13.233 回答
0

如果我理解正确,您的用例是这样的:

b = B()

def reset_b():
    global b
    b = B() # drops the reference to b, so it (and b.A) should be garbage collected

def get_a():
    return b.A

您担心的是,A从返回的已保存引用在重置get_a后仍然有效。b如果这是正确的,那么弱引用可能是解决它的一种方法:

import weakref

def get_a():
    return weakref.proxy(b.A)

如果在它所引用的对象被删除之后使用该对象,则大多数proxy操作都会引发异常。b.A

不过,我不确定这是一个好的设计。更好的解决方案可能是简单地记录get_a不应长期缓存的结果。相反,只要需要新的引用,就应该再次调用它。这不需要任何复杂的引用方案或异常处理,而且更容易思考和测试。

于 2013-07-28T22:24:37.957 回答