Вот решение, которое добавляет атрибут _derived
к каждому классу, содержащий производные классы этого класса:
class Meta(type):
def __new__(cls, name, bases, dict_):
new_class = type.__new__(cls, name, bases, dict_)
new_class._derived = {}
if isinstance(bases[0], Meta):
bases[0]._derived[name] = new_class
return new_class
class Magic(object):
__metaclass__ = Meta
class A(Magic):
pass
class B(Magic):
pass
print Magic._derived
печать
{'A': <class '__main__.A'>, 'B': <class '__main__.B'>}