2010-10-07 40 views
0

夥計們,我對Python非常陌生並且學習它來構建gui應用程序(使用wypython)。我有一個與python中的對象破壞有關的問題。 例如在myFrame中我有onNew(創建一個新文檔)和onOpen(打開文件)方法。python如何管理對象的刪除或破壞

簡而言之,它看起來像這樣。

def onNew 
    self.data=DataModel() 
    self.viewwindow=ViewWindow(self.data) 


def onOpen 
    dlg = wx.FileDialog(self, "Open file", os.getcwd(), "", "*.*", wx.OPEN) 
     if dlg.ShowModal() == wx.ID_OK: 
      self.data=DataModel.from_file(...) 
      self.view=View(self.data) 

現在,我想考慮「如果用戶點擊打開或再次點擊之後,他點擊之前」。

因此對於窗口類,我可以調用self.viewwindow.Destroy()來設置窗口。數據模型對象呢?如果我先撥打新號碼:self.data=DataModel(),然後打開並重新分配self.data=DataModel.from_file(...),那麼舊實例呢?我需要自己破壞它還是python會管理這個破壞?

+0

* shudder * wxPython喜歡用底層C++對象的生命週期來做自己的事情,所以不要相信Python能夠做正確的事情。 – 2010-10-07 08:31:38

+0

你好,AaronMcSmooth,你的意思是wxpython有GC並且值得信賴,而python是不可信的? – pepero 2010-10-07 08:40:21

+0

我不推薦使用GUI工具包來學習Python;從控制檯工具開始學習語言,以免由於特定GUI的API怪異而導致不良習慣和誤解。大多數GUI工具包都綁定到一個較低級別的API上,而這個API並不是用Python設計的,所以它們不像從一開始就爲Python設計的模塊那麼好。 – 2010-10-07 08:49:09

回答

2

Python有垃圾回收。只要你沒有任何引用掛在它周圍的舊對象將被收集。

只要你說self.data = somethingElse那麼舊的self.data就不會有任何引用(除非另一個對象引用了你的對象的self.data)。

+0

它可能被收集。它可能不會。你絕不應該假設你知道GC的工作原理 - 如果你沒有用完內存,那麼null GC是一個完全有效的GC。如果您希望以任何託管語言發佈對象,則需要自行完成。垃圾收集僅適用於您實際上不關心資源是否被釋放的情況,只有在下一次您需要的時候底層資源池才具有足夠的容量(這通常與內存有關,但與數據庫無關連接,UI窗口等) – 2010-10-07 10:57:44