Python - 迭代所有类

时间:2009-09-17 02:03:32

标签: python google-app-engine loops

如何迭代内存中加载的所有类的列表? 我正在考虑做备份,寻找从db.Model(Google App Engine)继承的所有类。

谢谢, 尼尔沃尔特斯

3 个答案:

答案 0 :(得分:9)

在“普通”Python中,您可以通过gc.getobjects()标准库模块的gc函数访问所有对象;然后很容易循环它们,检查哪一个是类(而不是实例或其他任何东西 - 我相信你的意思是实例类,但如果你自己也很容易得到类,如果这真的是你想要的等等。

不幸的是,App Engine中的gc模块没有实现getobjects - 这使得访问所有类非常困难。例如,通过调用:

创建的类
def makeaclass():
  class sic(object): pass
  return sic

并隐藏在某个地方的列表中,IS很难达到。

但幸运的是,既然你在问题的文本中说你只关心db.Model的子类,那比gc允许的更容易:

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

请确保明确忽略您不关心的类,例如Expando; - )。

请注意,此DOES仅为您提供CLASSES,实例 - 如果那些是您真正追求的,那么没有类似的简单快捷方式!

答案 1 :(得分:2)

类在模块中定义。模块由import语句创建。

模块只是字典。如果需要,可以在名为dir(x)

的模块上使用x函数

或者您可以在名为x.__dict__的模块上使用x

答案 2 :(得分: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必须是   一个班级

所以它想要一个类名作为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