Как выполнить итерации по атрибуты класса, в порядке они были определены? [дубликат]

Этот вопрос уже имеет ответ здесь:

Python идет с удобным dir() функция, которая перечислила бы содержание класса для Вас. Например, для этого класса:

class C:
   i = 1
   a = 'b'

dir(C) возвратился бы

['__doc__', '__module__', 'a', 'i']

Здорово, но заметьте как порядок 'a' и 'i' теперь отличается затем порядок, в котором они были определены.

Как я могу выполнить итерации по атрибутам C (потенциально игнорирующий встроенный документ и атрибуты модуля) в порядке, они были определены? Для класса C выше, быть 'i' затем 'a'.

Приложение: - я работаю над некоторым кодом сериализации/входа, в котором я хочу сериализировать атрибуты в порядке, они были определены так, чтобы вывод был подобен коду, который создал класс.

9
задан vaultah 5 January 2016 в 00:48
поделиться

2 ответа

Я не думаю, что это возможно в Python 2.x. Когда члены класса передаются методу __ new __ , они передаются в виде словаря, так что на этом этапе порядок уже был потерян. Поэтому даже метаклассы не могут вам здесь помочь (если нет дополнительных функций, которые я пропустил).

В Python 3 вы можете использовать новый специальный метод __ prepare __ для создания упорядоченного dict (он даже приведен в качестве примера в PEP 3115 ).

8
ответ дан 2 November 2019 в 23:06
поделиться

Эта информация недоступна, поскольку атрибуты хранятся в dict, который по своей природе неупорядочен. Python нигде не хранит эту информацию о заказе.

Если вы хотите, чтобы ваш формат сериализации сохранял вещи в определенном порядке, вы должны указать , который упорядочивает явно . Вы не должны использовать dir , который содержит вещи, которые вы не знаете или о которых не заботитесь, вы должны явно предоставить список (или что-то еще), описывающий, что сериализовать.

1
ответ дан 2 November 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: