Python - 遍历所有类
我该如何遍历内存中加载的所有类的列表呢?我在考虑做一个备份,想找出所有继承自 db.Model 的类(这是 Google App Engine 的一部分)。
谢谢,
Neal Walters
3 个回答
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() 的第一个参数必须是一个类
所以看起来它需要的是一个类名作为参数,而不是一个对象名。
根据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
2
类是在模块中定义的。模块是通过一个 import
语句来创建的。
模块其实就是字典。如果你想查看一个名为 x
的模块里有什么,可以使用 dir(x)
这个函数。
或者你也可以用 x.__dict__
来查看名为 x
的模块里的内容。
9
在“正常”的Python中,你可以通过gc.getobjects()
这个函数来获取所有对象,这个函数是gc
这个标准库模块的一部分。这样你就可以很方便地遍历这些对象,检查哪些是类(而不是实例或其他东西——我相信你是想说类的实例,不过如果你真的想要类本身,也很容易获取到)。
不过,遗憾的是,App Engine中的gc
模块并没有实现getobjects
这个功能,这让你很难获取到所有的类。例如,通过以下方式创建的类:
def makeaclass():
class sic(object): pass
return sic
如果它被隐藏在某个列表里,那就很难找到它了。
但幸运的是,因为你在问题中提到你只关心db.Model
的子类,这样就比gc
允许的要简单多了:
for amodel in db.Model.__subclasses__():
...
只要确保你明确忽略那些你不关心的类,比如Expando
就可以了;-)。
请注意,这样做只会给你类,而不是实例——如果你真正想要的是实例,那就没有这么简单的捷径了!