2011-07-04 79 views
2

我有一個模塊foo,它定義了一個類Foo,並實例化該類的多個實例。如何獲取當前模塊中的一個類的所有實例

從其他模塊,我可以import foo並獲得通過實例化的Foo對象的列表:

[getattr(foo,f) for f in dir(f) if isinstance(getattr(foo,f), foo.Foo)] 

這將是方便,如果我能做到這一點從模塊foo內。但正如書面所述,foo的名稱在foo內部沒有任何意義,並且更改爲self沒有幫助。

有沒有在這個模塊中使用自省的方法來找到這個類的所有實例?我希望有一種方法可以避免列出並附加每個實例。

+1

我建議重命名這個「如何獲得一個類的所有實例化實例」,假設這就是你想要做的。 – ninjagecko

回答

8

goal: "import foo and obtain a list of the Foo objects instantiated by..."

你根本不需要反思。想象一下,這是你的課程:

class Registered(object): 
    _all = set() 
    def __init__(self): 
     self.__class__._all.add(self) 

Demo;實例一組對象,並指他們:

>>> Registered() 
>>> Registered() 
>>> Registered() 

>>> Registered._all 
{<__main__.Registered object at 0xcd3210>, <__main__.Registered object at 0xcd3150>, <__main__.Registered object at 0xcd31d0>} 

由於您使用dir,如果我理解正確的話,你正在努力尋找在當前模塊的全局變量的所有對象。但是,它並不能真正讓你獲得當前模塊中的所有對象,只有那些綁定到變量的對象。如果這是你真正想要的,你可以做{var for name,var in globals() if isinstance(var,Foo)}

如果這不是你真正想要的,你可以修改上面的跟蹤的對象是在經inspect.currentframe().f_back.f_globals什麼定義的模塊,但是這會防止你使用foo.py或其他模塊中定義的工廠功能。

如果你實際上試圖獲取在模塊中創建的東西的所有實例,這是一個嚴重的編碼問題的跡象;考慮在該模塊中寫一個工廠函數包裝器,除了傳遞初始化參數並返回結果,跟蹤已初始化的對象外,它什麼也不做。

+0

當我嘗試這個時,我得到'NameError:全局名'__class__'未定義' –

+2

它應該是'self .__ class__' .... –

+0

@FarmBoy:用'Registered'替換'__class__';這是在python3中做更好的方法(如果你決定改變你的類的名字,你不必在每次使用它時都替換它) – ninjagecko

相關問題