【发布时间】:2019-09-27 12:49:17
【问题描述】:
我有一个类结构,其中一个类的实例需要保存对另一个类实例的引用。阅读some other posts,最好(最安全)的方法是使用weakref。它看起来像这样:
class ClassA:
def __init__(self):
self.my_b = ClassB(self)
self.some_prop = 1
class ClassB:
def __init__(self, some_a):
self.some_a = weakref.ref(some_a)
我的问题是,要通过 ClassB 的实例访问 some_prop,您必须调用引用 as per documentation,这将使对象可用:
self.some_a().some_prop
但是,我的问题是是否应该每次都调用引用。我们不能只在init中调用weakref吗?即
self.some_a = weakref.ref(some_a)()
然后像
一样访问它(更自然)self.some_a.some_prop
我感觉首选第一个选项,但我试图了解原因。在我的情况下,引用的对象不可能在另一个之前被删除。
【问题讨论】:
-
“阅读其他一些帖子,最好(最安全)的方法是使用weakref。”为什么?如果您使用后一个选项,那么您最好不要使用
weakref。你到底想解决什么问题? -
@juanpa.arrivillaga 见this post。问题是只调用一次 ref 并使用它而不是每次想要访问引用的属性时调用它的缺点是什么。
-
@BramVanroy 该帖子已经过时了。 Python 垃圾收集器足够聪明,可以检测循环引用并删除两个相互引用的对象,如果在外部范围内没有对它们的引用。你真的不需要使用
weakref。 -
@sanyash 谢谢。如果您愿意,可以将其发布为答案。
标签: python oop weak-references