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

时间:2018-10-01 12:14:29

标签: python inheritance superclass

我已经稍微熟悉了super的使用方式,而且每次发现问题时,我都会对其稍作更改。我仍然必须使用Python 2.7,因此必须使用旧语法。

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

我意识到super基本上会返回一个对象,因此可以不将其不断创建,而可以将其分配给class属性。似乎稍微整洁了一点,因为该实例只需要读取一次,但是这样做会不会引起任何潜在的问题。

我一直将其设置为self.__super,所以没有什么可以真正干扰它,在执行过多操作并不得不重写全部代码之前,我想发表一下看法。

1 个答案:

答案 0 :(得分:1)

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,则浪费大量内存。

一个更好的解决方案是实现一个返回super对象的property

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

这样,不会创建参考循环。