[英]Python - Iterate over all classes
如何遍歷內存中加載的所有類的列表? 我正在考慮做備份,尋找從db.Model(Google App Engine)繼承的所有類。
謝謝,Neal Walters
在“普通”Python中,您可以通過gc
標准庫模塊的gc.getobjects()
函數訪問所有對象; 然后很容易循環它們,檢查哪一個是類(而不是實例或其他任何東西 - 我相信你的意思是類的實例 ,但如果那真的是你想要的話,你也很容易自己獲得類),等等
不幸的是,App Engine中的gc
模塊沒有實現getobjects
- 這使得到達所有類非常困難。 例如,通過調用創建的類:
def makeaclass():
class sic(object): pass
return sic
並隱藏在某個地方的列表中,很難達到。
但幸運的是,既然你在問題的文本中說你只關心db.Model
子類,那就比gc
更容易:
for amodel in db.Model.__subclasses__():
...
只需確保明確忽略您不關心的類,例如Expando
;-)。
請注意,這個DOES只提供了CLASSES, 而不是實例 - 如果那些是您真正想要的,那么沒有類似的簡單快捷方式!
類在模塊中定義。 模塊由import
語句創建。
模塊只是字典。 如果需要,可以在名為x
的模塊上使用dir(x)
函數
或者您可以在名為x
的模塊上使用x.__dict__
。
基於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必須是一個類
所以它想要一個類名作為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__)
謝謝你們兩個!
尼爾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.