Python - 遍历所有类

2 投票
3 回答
2035 浏览
提问于 2025-04-15 14:22

我该如何遍历内存中加载的所有类的列表呢?我在考虑做一个备份,想找出所有继承自 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就可以了;-)。

请注意,这样做只会给你类,而不是实例——如果你真正想要的是实例,那就没有这么简单的捷径了!

撰写回答