2015-12-04 3 views
-1

У меня есть базовый класс, который должен поддерживать словарь, указывающий на его подклассы (чтобы я мог создавать их динамически позже).Рекурсивная натура Python

Каждый подкласс, конечно же, должен наследовать базовый класс. Проблема, с которой я сталкиваюсь, заключается в том, что, в любом случае, я заявляю сначала, не могу найти другого. Любая помощь приветствуется?

class A(object): 
    A_TYPES = { 
     'B': B 
    } 

class B(A): 
    pass 

ответ

0

Классы уже поддерживают список их подклассов, доступные с помощью метода __subclasses__().

+0

Спасибо, мне нужно, чтобы их ассоциативный список мог получить к ним доступ по заданному параметру – pistacchio

+0

Просто создайте индекс после определения классов – alexis

0

Я не знаю, почему вы должны сохранить эти данные внутри A класса, но все равно ...

Вы можете добавить атрибут A_TYPES класса к A после того как вы определили все подклассы:

class A(object): 
    pass 

class B(A): 
    pass 

class C(A): 
    pass 

A.A_TYPES = {'B': B, 'C': C} 

Конечно, любые экземпляры любого из этих классов смогут получить доступ (и обновить) .A_TYPES. Например,

inst = C() 
inst.A_TYPES.update({'F': 'fake'}) 
print A.A_TYPES 

выход

{'C': <class '__main__.C'>, 'B': <class '__main__.B'>, 'F': 'fake'} 
0

Если вы просто хотите получить список всех подклассов, вы можете получить всегда-текущий список с cls.__subsclasses__() как писал @DanielRoseman. Вы хотите, чтобы посмотреть их по имени? Нет проблем, просто создать индекс себя:

class A: 
    pass 

class B(A): 
    pass 

... 

A.subclass_index = dict((sub.__name__, sub) for sub in A.__subclasses__()) 

Этот индекс является статическим, так что вы должны только строить его после того, как были определены подклассы.

В тех случаях, когда необходимо отслеживать только определенные подклассы, может быть целесообразно активно «регистрировать» те (классы), которые вас интересуют. Один из способов сделать это - через декоратор, который вы применяете к тем подклассам, которые вы хотите зарегистрировано. Но это выходит за рамки того, что вы говорите, что вам нужно.

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