簡體   English   中英

如何徹底摧毀一個物體?

[英]how to destroy an object completely?

請幫助摧毀整個區域

import tkinter
import tkinter.messagebox
import sys


class TP(tkinter.Frame):

    def __init__(self, parent):
        tkinter.Frame.__init__(self, parent)
        self.pack(side = 'top', fill = 'x', expand = 'yes')
        self.parent = parent
        self.make_menu_bar()

    def make_menu_bar(self):
        self.menubar = tkinter.Menu(self) 
        self.parent.config(menu = self.menubar)                           

        self.file = tkinter.Menu(self.menubar)
        self.file.add_command(label = 'New', command = lambda: self.toggle_area(True))
        self.file.add_command(label = 'Close...', command = lambda: self.toggle_area(False))
        self.menubar.add_cascade(label = 'File', menu = self.file)

    def toggle_area(self, action):
        if action:
            self.area = tkinter.Text(self)
            self.area.pack(expand = 'yes', fill = 'both')
            print(sys.getrefcount(self.area))
        else:
            print(sys.getrefcount(self.area))
            self.area.destroy()
            print(sys.getrefcount(self.area))


if __name__ == '__main__':
    root = tkinter.Tk()
    TP(root)
    root.mainloop()

問題是在選擇菜單項“關閉”后,屏幕上將顯示對對象self.area的引用數量。 對對象self.area的引用數仍不為0和2。即,該對象在內存中並且未進行垃圾回收

根據定義,如果您可以執行sys.getrefcount(someReferenceToAnObject)則您仍然對某個對象一些引用 ,因此引用計數不能為零。

話雖如此,垃圾回收永遠不會立即進行,因此該對象的實際回收可能會在以后進行。 您確實不應該為此擔心。 當您重新創建tkinter.Text時,舊的可能已完全消失,可以進行垃圾收集。

話雖這么說,如果您想減少引用數量,您可能也想在銷毀它后再進行del self.area

首先,你不只是調用self.area.destroy()而是從分離self.areadel self.areaself.area = None 這將刪除TP實例中的引用。 但是, TP可能很快就會被銷毀,因此這不是問題。 盡管這還不夠,但顯然, root對象擁有對您的Text對象的引用(可能不是直接引用)。

無論如何,沒有什么可擔心的。 在CPython(這是最廣泛使用的Python實現)中,垃圾回收的完成方式是立即刪除具有零引用計數器的對象。 但是,不能保證這種行為在任何地方都會發生。 即使沒有引用對象,對象也可能被刪除很多,而且要晚得多。 而且沒有強制立即銷毀的便攜式方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM