这会泄漏外部类对象吗?你知道吗
class Base:
def AppendToMenu(self,menu,window,data): pass
def Execute(self,event): pass
class Outer(Base):
def AppendToMenu(self,menu,window,data):
if len(data) == 1:
_leak = self # ?
class _Inner(Base):
def Execute(self, event):
_leak.Execute(event)
cl = _Inner()
cl.AppendToMenu(menu,window,data)
# else...
def Execute(self,event): self.handle(event)
这样可以吗?你知道吗
class Outer(Base):
def AppendToMenu(self,menu,window,data):
if len(data) == 1:
class _Inner(Base):
def __init__(self, outer):
self.outer = outer
def Execute(self, event):
self.outer.Execute(event)
cl = _Inner(self)
cl.AppendToMenu(menu,window,data)
从Java到闭包是如此的新鲜。你知道吗
这两种方法都不会导致泄漏。你知道吗
Python对象的生存期由引用计数控制;如果没有剩余的引用,则删除该对象。在所有情况下,
Outer.AppendToMenu()
方法中的实例和类只被局部引用,不会导致泄漏。你知道吗在这两种情况下,类和实例的计数如下所示:
class _Inner
创建类,ref count为1(本地名_inner
)cl = _Inner()
创建实例,实例的ref count为1,_Inner
类引用在实例引用其类时上升为2。你知道吗Outer.AppendToMenu()
方法退出,并且清除局部变量。_Inner
和cl
被清除,它们的引用计数分别减少1到1和0。cl
实例被删除,并带有对_Inner
类的剩余引用,因此它也被删除。你知道吗对
Outer
实例的引用上的闭包(通过_leak
/self
)从未使用过,因此不会创建对Outer
实例的其他引用。你知道吗就我个人而言,如果我不能首先消除在该方法中使用本地类对象的需要,我会选择这里的闭包选项。你知道吗
相关问题 更多 >
编程相关推荐