2014-02-14 77 views
0

所以我對python很新穎,所以很善良。 我想創建一個全局的對象目錄作爲所有我的程序的基礎,作爲跟蹤我的程序中所有創建的對象實例的手段。Python:使用for循環從對象列表中提取引用

所以..

我創建包含對象引用(未標識的)列表的類。 例如:

class objDirectory: 
    name = "" 
    count = 0 
    objDir = [] 
    def __init__(self): 
     print("Initiating object directory.") 
     name = "objDirectory" 
     self.count= 1 
     self.objDir = [ self ] 
     return 
    def getObj(self, name): 
     print("Searching directory for:", name) 
     for o in self.objDir: 
      if o.name is name: 
       print("Returning:", name) 
       return obj 
      else: 
       print("Search failed") 
      return 

但是,一旦一個對象被添加到列表中,我運行Get腳本不回我的對象​​。我甚至通過使用directory.objDir [x]來驗證。 (這總是引用我的對象)。

我沒有做什麼,或做錯了什麼?

謝謝。

結果:

setDirectory() 啓動對象目錄。 全球目錄參考設置 測試= OBJ( 「測試」) 起爆:測試 重複檢查 記錄:test1的 對象計數:2 T1 = directory.getObj( 「測試1」) 搜索目錄:test1的 搜索失敗 打印(directory.objDir) [< 在0x032C86F0 .objDirectory對象>,< 在0x032C8710的obj對象>]

回答

0

我不太明白你打算如何使用這個對象,但是我發現__init__方法存在一些問題。
首先,我想你的對象應該是singleton,但事實並非如此。您在此處定義的類屬性:

class objDirectory: 
    name = "" 
    count = 0 
    objDir = [] 

但在你__init__方法,你總是覆蓋它們,而不是增加他們。這意味着每次你寫a=objDirectory()之類的東西時,count將被設置爲1 ,對於那個例子。另外,請注意(至少在python2.7中),您需要一個@classmethod裝飾器,用於您希望修改類屬性(而不是實例屬性)的每個函數。像這樣:

class objDirectory: 
    count=0 

    @classmethod 
    def add_object(cls): 
     cls.count+=1 
    def __init__(self): 
     self.add_object() 

這也適用於objDir以及。
其次,在您的__init__方法中,您有一個名爲name的變量,它從不使用。也許你的意思是self.name

有落實單身更好的方法,但是這裏是一個簡單的例子,可能會更容易理解,如果你是新來的Python:

class mySingleton(object): 
    singletonObject = None 
    def __new__(cls): 
     if not cls.singletonObject: 
      cls.singletonObject = super(mySingleton, cls).__new__(cls) 
     return cls.singletonObject 

__new__方法是創建一個實際的靜態方法實例。返回值是創建的新實例。像這樣覆蓋它會讓我得到每個調用mySingleton()的同一個實例;聲明mySingleton() is mySingleton()將始終爲真。

+0

非常感謝你,我需要圍繞你在這裏的一些東西,但我還有很多東西要學習。 – user3312001