我已经稍微熟悉了super
的使用方式,而且每次发现问题时,我都会对其稍作更改。我仍然必须使用Python 2.7,因此必须使用旧语法。
我尝试和停止使用的两种替代方法是super(self.__class__, self)
和InheritClass.func(self, ...)
。
我意识到super
基本上会返回一个对象,因此可以不将其不断创建,而可以将其分配给class属性。似乎稍微整洁了一点,因为该实例只需要读取一次,但是这样做会不会引起任何潜在的问题。
我一直将其设置为self.__super
,所以没有什么可以真正干扰它,在执行过多操作并不得不重写全部代码之前,我想发表一下看法。
答案 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)
这样,不会创建参考循环。