【问题标题】:Should a Weakref object be called every time it's accessed?每次访问 Weakref 对象时都应该调用它吗?
【发布时间】: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


【解决方案1】:

为了完整起见,我会写下这个答案,这是@sanyash 评论的副本。

Python 垃圾收集器足够聪明,可以检测循环引用并删除两个相互引用的对象,如果在外部范围内没有对它们的引用。你真的不需要使用weakref

【讨论】:

    猜你喜欢
    • 2010-10-23
    • 2012-01-25
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多