如何迭代内存中加载的所有类的列表? 我正在考虑做备份,寻找从db.Model(Google App Engine)继承的所有类。
谢谢, 尼尔沃尔特斯
答案 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