2009-12-31 76 views
0

我正在尋找一種方法來獲取從Python中的特定基類派生的所有類的列表。查找從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模型,並生成適當的頁面,但目前我手動維護一個列表,有沒有一種方法來確定任何派生自「資產」的類名稱列表?

+1

是的......「grep」爲它;) – 2009-12-31 17:43:55

+0

沒有想到這一點,但我需要知道什麼文件要grep,而不是所有的模型都在同一個文件中,我不想grep整個源代碼樹。 – 2009-12-31 17:49:23

+1

您可以通過使用自定義元類來教會父類跟蹤其子級,但對於坦率地聽起來有點微不足道的事情來說,這確實是很多工作。 – 2009-12-31 17:50:42

回答

9

Asset.__subclasses__()給出Asset立即子類,但不管是足夠取決於立即部分是否適合你一個問題 - 如果你想所有的子級別的任何數字,你需要遞歸擴展如:

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

你的例子表明你只在乎類直接繼承Asset,在這種情況下,你可能不需要擴張的這種額外的水平。

+0

我只需要直接的子類,所以這完美的作品,謝謝。 – 2009-12-31 17:53:29