構文解析は検査で既に行われていることに注意してくださいinspect.findsource
。クラス定義のモジュールを検索し、ソースと行番号を返す を見てください。その行番号でソートすると(別のモジュールで定義されたクラスを分割する必要がある場合もあります)、正しい順序が得られます。
ただし、この関数は文書化されていないようで、正規表現を使用して行を検索しているだけなので、あまり信頼できない可能性があります。
もう 1 つのオプションは、メタクラスを使用するか、オブジェクトに対する情報を暗黙的または明示的に順序付けする他の方法です。例えば:
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 に設定する必要があります)。