Python本地类

2024-04-19 04:51:10 发布

您现在位置:Python中文网/ 问答频道 /正文

这会泄漏外部类对象吗?你知道吗

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到闭包是如此的新鲜。你知道吗


Tags: selfeventexecutedatabasecldefpass
1条回答
网友
1楼 · 发布于 2024-04-19 04:51:10

这两种方法都不会导致泄漏。你知道吗

Python对象的生存期由引用计数控制;如果没有剩余的引用,则删除该对象。在所有情况下,Outer.AppendToMenu()方法中的实例和类只被局部引用,不会导致泄漏。你知道吗

在这两种情况下,类和实例的计数如下所示:

  • class _Inner创建类,ref count为1(本地名_inner
  • cl = _Inner()创建实例,实例的ref count为1,_Inner类引用在实例引用其类时上升为2。你知道吗
  • Outer.AppendToMenu()方法退出,并且清除局部变量。_Innercl被清除,它们的引用计数分别减少1到1和0。cl实例被删除,并带有对_Inner类的剩余引用,因此它也被删除。你知道吗

Outer实例的引用上的闭包(通过_leak/self)从未使用过,因此不会创建对Outer实例的其他引用。你知道吗

就我个人而言,如果我不能首先消除在该方法中使用本地类对象的需要,我会选择这里的闭包选项。你知道吗

相关问题 更多 >