【问题标题】:Finding all classes that derive from a given base class in python在python中查找从给定基类派生的所有类
【发布时间】:2009-12-31 17:34:13
【问题描述】:

我正在寻找一种方法来获取派生自 Python 中特定基类的所有类的列表。

更具体地说,我使用的是 Django,我有一个抽象的基础模型,然后是几个从该基类派生的模型......

class Asset(models.Model):
    name = models.CharField(max_length=500)
    last_update = models.DateTimeField(default=datetime.datetime.now())
    category = models.CharField(max_length=200, default='None')

    class Meta:
        abstract = True

class AssetTypeA(Asset):
    junk = models.CharField(max_length=200)
    hasJunk =  models.BooleanField()

    def __unicode__(self):
        return self.junk

class AssetTypeB(Asset):
    stuff= models.CharField(max_length=200)

    def __unicode__(self):
        return self.stuff

我希望能够检测是否有人添加了新的 AssetTypeX 模型并生成适当的页面,但目前我正在手动维护一个列表,有没有办法确定派生自“的任何内容的类名列表”资产”?

【问题讨论】:

  • 没想到,但我需要知道要在哪些文件中进行 grep,并非所有模型都在同一个文件中,我不想 grep 整个源代码树。
  • 您可以通过使用自定义元类来教父类在声明子类时跟踪其子类,但坦率地说,这对于听起来有点微不足道的事情来说确实需要做很多工作。

标签: python django


【解决方案1】:

Asset.__subclasses__() 给出了Assetimmediate 子类,但这是否足够取决于该 immediate 部分是否对您来说是个问题——如果您想要全部后代到任何数量的级别,您都需要递归扩展,例如:

def descendants(aclass):
  directones = aclass.__subclasses__()
  if not directones: return
  for c in directones:
    yield c
    for x in descendants(c): yield x

您的示例表明您只关心直接继承 Asset 的类,在这种情况下您可能不需要这种额外的扩展级别。

【讨论】:

  • 我只需要直接的子类,所以这很好用,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多