簡體   English   中英

Python - 迭代所有類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM