2011-04-16 15 views
4

假設我們在內存中有很多對象。每個人都有一個獨特的ID。我如何迭代內存來查找與某個ID相比較的特定對象?爲了抓住它並通過getattr使用它?Python反射

+2

你不知道。只要保持一個參考。這已經是主要實施中的標識,並且無論如何都是正確的(tm)。 – delnan 2011-04-16 13:23:21

回答

10

您應該維護這些對象的集合,因爲它們是在類屬性中創建的,然後提供用於檢索它們的類方法。

class Thing(object): 
    all = {} 

    def __init__(self, id, also, etc): 
     self.id = id 
     self.all[id] = self 

    @classmethod 
    def by_id(cls, id): 
     return cls.all[id] 
0

你可以讓所有的新實例都訂閱了「註冊表」字典,與ID->對象的映射:

registry = {} 

class MyClass(object): 
    def __init__(self, ...): 
     id = ... 
     registry[id] = self 

MyClass.__all__ = registry 

沿東西線這相當於其他可接受的解決方案(然而,另一個更爲'pythonic')。我已經用兩種方法改進了這種方法:1)可以爲註冊表創建一個自定義容器類,它允許您通過多個ID來進行查找; 2)你也可以創建一個自動添加代碼的元類,但如果你還需要其他元類的元類,這會變得很難看。

編輯:因爲其他的答案是可以接受的,加入的方式來分解出的設計模式

2

你可以問垃圾收集所有現有對象和遍歷該集合,找到你正在尋找的東西,但是那可能是錯誤的事情要做,除非你有非常特殊的理由去做。

+0

+1酷,我不知道。我不知道我會永遠有理由使用這個珍聞,但冷靜。 – dietbuddha 2011-04-17 04:42:25

0

首先給大家回答我非常感謝,我週末在我的心中是這樣的:

for ech in globals(): 
     if str(type(globals()[ech])).find('instance') != -1: 
      if (globals()[ech].__dict__.has_key('onoma')): 
       print "%s, %s, %s"%(ech, globals()[ech].__dict__, id(globals()[ech])) 

該做的工作,雖然我不知道這是好事還是不錯的辦法( 「onoma」是希臘字的名稱)。 我在Pyton的文檔中讀到:weakid的_id2obj_dict = weakref.WeakValueDictionary()。我也給了一個鏡頭。尼斯和ninjagecko我認爲很好的方法和類似。 但是在這種情況下,我怎麼能確定一個對象完全從內存中釋放出來?