将 super() 设置为 class 属性是否存在任何潜在问题?

Are there any potential issues with setting super() to a class attribute?

我稍微改变了我使用 super 的方式,因为我对它有了一点熟悉,而且每次我都发现了一个问题。我仍然不得不使用 Python 2.7,所以旧语法是必要的。

我尝试并停止使用的两种替代方法是 super(self.__class__, self)InheritClass.func(self, ...)

我意识到 super 基本上是 returns 一个对象,因此与其不断创建对象,不如将其分配给 class 属性。实例只需要读取一次,这样看起来简洁一些,但是这样会不会有什么潜在的问题呢

我一直将它设置为 self.__super 所以没有什么可以真正干扰它,我只是想在我做太多而不得不重写整个代码之前提出意见。

super 对象分配给实例属性的问题在于它会创建引用循环:

import weakref

class RefCycle(object):
    def __init__(self):
        self.__super = super(RefCycle, self)

obj = RefCycle()

ref = weakref.ref(obj)
del obj
assert ref() is None  # <- assertion fails, the object still exists

当然垃圾收集器会最终检测并清理这个引用循环,但是如果你养成这样使用super的习惯,你 浪费大量内存。

一个更好的解决方案是实现一个 property 那个 returns 一个 super 对象:

class NoRefCycle(object):
    @property
    def __super(self):
        return super(NoRefCycle, self)

这样,就不会创建引用循环。