2009-12-31 4 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 и сгенерировать соответствующие страницы, но в настоящее время я поддерживаю список вручную, есть ли способ определить список имен классов для всего, что происходит от «Asset»?

+1

Да ... «grep» для него;) –

+0

Не думал об этом, но мне нужно было знать, какие файлы нужно вставлять, не все модели находятся в одном файле, и я не хочу для grep всего дерева источников. –

+1

Вы можете научить родительский класс отслеживать свои дети, поскольку они объявлены с использованием пользовательского метакласса, но это действительно большая работа для чего-то, что откровенно звучит немного тривиально. –

ответ

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

Мне нужны только прямые подклассы, поэтому это отлично работает, спасибо. –

Смежные вопросы