Этот вопрос уже имеет ответ здесь:
Python идет с удобным dir()
функция, которая перечислила бы содержание класса для Вас. Например, для этого класса:
class C:
i = 1
a = 'b'
dir(C)
возвратился бы
['__doc__', '__module__', 'a', 'i']
Здорово, но заметьте как порядок 'a'
и 'i'
теперь отличается затем порядок, в котором они были определены.
Как я могу выполнить итерации по атрибутам C (потенциально игнорирующий встроенный документ и атрибуты модуля) в порядке, они были определены? Для класса C выше, быть 'i'
затем 'a'
.
Приложение: - я работаю над некоторым кодом сериализации/входа, в котором я хочу сериализировать атрибуты в порядке, они были определены так, чтобы вывод был подобен коду, который создал класс.
Я не думаю, что это возможно в Python 2.x. Когда члены класса передаются методу __ new __
, они передаются в виде словаря, так что на этом этапе порядок уже был потерян. Поэтому даже метаклассы не могут вам здесь помочь (если нет дополнительных функций, которые я пропустил).
В Python 3 вы можете использовать новый специальный метод __ prepare __
для создания упорядоченного dict (он даже приведен в качестве примера в PEP 3115 ).
Эта информация недоступна, поскольку атрибуты хранятся в dict, который по своей природе неупорядочен. Python нигде не хранит эту информацию о заказе.
Если вы хотите, чтобы ваш формат сериализации сохранял вещи в определенном порядке, вы должны указать , который упорядочивает явно . Вы не должны использовать dir
, который содержит вещи, которые вы не знаете или о которых не заботитесь, вы должны явно предоставить список (или что-то еще), описывающий, что сериализовать.