将 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)
这样,就不会创建引用循环。
我稍微改变了我使用 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)
这样,就不会创建引用循环。