2011-07-28 42 views
1

當我試圖跨多個對象執行代碼時,我發現自己重複了一個常見模式。使用全局MANIFEST進行對象執行。有沒有更好的辦法?

Arg_list_one = ["first","second", "so on"] 
Arg_list_two = ["first","second", "so on"] 


MANIFEST = [ ] 

class connection(object): 
    def __init__(self, args): 
     ... 
     MANIFEST.append(self) 
    def Run(self): 
     ... 

connection(Arg_list_one) 
connection(Arg_list_two) 

[conn.Run() for conn in MANIFEST] 

這是一個模式(或反模式)?或者只是我編造的東西?

還有其他更好的方法嗎?

回答

4

爲什麼你需要一個有史以來創建的所有對象的列表?其中許多可能屬於您的應用程序完全不相關的部分!給定的一段代碼不應該認爲它是唯一一個使用類的人。特別是因爲通常不需要:

  • 函數創建一堆對象,然後對所有對象執行一些操作?將對象放入臨時的本地範圍列表中。
  • 需要在函數之間共享一些對象嗎?把它們放在一個列表中,將列表傳遞給應該看到對象的人。
  • 某些類的實例共享這些對象中的某些對象?製作一份清單並將其放入課堂。
  • 等等,你會看到這是怎麼回事。

更實際和少文體的問題是,這個名單會保持每一個對象,它是有史以來實例化活着永遠該類。他們說,不能在Python中創建內存泄漏...(這可以通過弱引用避免,但會使代碼更加複雜,以便透明地刪除死引用。)

該解決方案几乎沒有更多的輸入和以後可以爲你節省很多麻煩。接下來,您將使用本地變量爲自己節省return

connections = [Connection(arg_list_one), Connection(arg_list_two)] 
for connection in connections: 
    connection.run() 

這就是說,可能存在這樣的列表可以是(與所述內存泄漏的修復,當然)有用的情況。我只是沒有看到任何與你的例子接近的東西,我認爲這種情況非常罕見。

+0

內存泄漏......我更喜歡稱之爲非確定性擴展。感謝您的解釋。我以爲我做錯了(我的第一個暗示是我正在使用全局變量)。 –

1

我建議將清單移入類中。如果它真的被用作類變量,那就把它變成一個。

class connection(object): 
    MANIFEST = [ ] 
    def __init__(self, args): 
     ... 
     self.MANIFEST.append(self) 
    def Run(self): 
     ... 
    @classmethod 
    def RunAll(cls): 
     for conn in cls.MANIFEST: 
      conn.Run() 

connection(Arg_list_one) 
connection(Arg_list_two) 

conn.RunAll() 

此外,如果有大量的對象,你的方法聚集的None秒(或任何Run回報)一個長長的清單,所以你可能有一個正常的for循環更好。

編輯:內存泄漏問題是一個好點。如果這樣做,請使用特殊的__del__方法刪除列表中的對象。

編輯2:其實,我認爲你需要在close()方法中做到這一點,因爲__del__永遠不會被調用,而列表中有一個引用。

+0

我不得不查看@classmethod裝飾器,這在這個例子中非常有用。 –

相關問題