2009-09-17 153 views
2

我如何可以遍歷在內存中加載的所有類的列表? 我正在考慮做一個備份,尋找從db.Model(Google App Engine)繼承的所有類。Python的 - 遍歷所有類

謝謝, 尼爾沃爾特斯

回答

9

在「正常」Python中,您可以通過gc標準庫模塊的gc.getobjects()函數訪問所有對象;然後很容易循環,檢查哪些是類(而不是實例或其他) - 我相信你的意思是實例類,但如果這真的是你想要的,你也可以非常容易地獲得這些類)等。

不幸的是,App Engine中的gc模塊沒有實現getobjects - 這使得到達所有類非常困難。例如,通過呼叫創建一個類:

def makeaclass(): 
    class sic(object): pass 
    return sic 

並隱藏到某處的列表中,IS將很難觸及。

但幸運的是,因爲你在你的問題的文字說,你只關心db.Model子類,這比gc更容易將允許:

for amodel in db.Model.__subclasses__(): 
    ... 

只要確保你明確地忽略這樣的班,你不關心一下,如Expando ;-)。

注意,這確實讓你只和準確的類,實例 - 有沒有類似的快捷方便,如果那些你真的後在做什麼!

+0

謝謝 - 用代碼查看我的答案。 – NealWalters 2009-09-17 03:29:12

2

類是在模塊中定義。模塊由import聲明創建。

模塊是簡單的字典。如果你願意,你可以使用一個名爲x

模塊上的dir(x)功能或者你可以一個名爲x模塊上使用x.__dict__

+0

謝謝 - 請參閱我的答案和代碼。 – NealWalters 2009-09-17 03:28:37

0

根據S.Lott的回答: 如果我省略「if issubclass」,除非我獲得了我不想要的課程,否則這將起作用。

import dbModels 
    self.response.out.write("<br/><br/>Class Names:</br/>") 
    for item in dbModels.__dict__: 
     if issubclass(item, db.Model): 
     self.response.out.write("<br/>" + item) 

上面給出的錯誤:

TypeError: issubclass() arg 1 must be a class

所以它要一個類名作爲PARM,而不是對象名稱顯然。

根據Alex的答案,這個偉大的工作:

self.response.out.write("<br/><br/>Class Names Inheriting from db.Model:</br/>") 
    for item in db.Model.__subclasses__(): 
     self.response.out.write("<br/>" + item.__name__) 

感謝兩個!

Neal