inspectで解析がすでに完了していることに注意してください。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"))
は、しかし、これはかなり煩わしい変更が
なぜこれをやりたいですか? –
djangoのフォームとモデル宣言は、エントリが作成された順番で行おうとします。ただし、属性はクラス宣言とは対照的にインスタンスです。私はクラス宣言が自動テンプレートの生成に役立つように順序付けられているかどうかを調べようとしています。 – molicule
このような奇妙な質問のために、あなたがやろうとしていることをやりたい理由を説明し、djangoタグを追加する方がいいでしょう。 –