Обратите внимание, что этот анализ уже сделан для вас в проверке - посмотрите на inspect.findsource
, который ищет в модуле определение класса и возвращает номер источника и номер строки. Сортировка по этому номеру строки (вам также может потребоваться разделить классы, определенные в отдельных модулях) должна дать правильный порядок.
Однако эта функция, похоже, не документирована, а просто использует регулярное выражение для поиска строки, поэтому она не может быть слишком надежной.
Другим вариантом является использование метаклассов или какой-либо другой способ неявного или явного упорядочения информации для объекта. Например:
import itertools, operator
next_id = itertools.count().next
class OrderedMeta(type):
def __init__(cls, name, bases, dct):
super(OrderedMeta, cls).__init__(name, bases, dct)
cls._order = next_id()
# Set the default metaclass
__metaclass__ = OrderedMeta
class A:
class D:
pass
class C:
pass
print sorted([cls for cls in [getattr(A, name) for name in dir(A)]
if isinstance(cls, OrderedMeta)], key=operator.attrgetter("_order"))
Однако это довольно навязчивое изменение (требует установки метакласса всех интересующих вас классов в OrderedMeta)