Python: я должен поместить свои данные в списки или атрибуты объекта? - PullRequest
2 голосов
/ 12 сентября 2010

Я ищу подходящую структуру данных в Python для обработки переменных структурных форм. Под переменно структурированными формами я подразумеваю, что число полей формы и типы содержимого формы заранее неизвестны. Они определяются пользователем, который заполняет формы своим вводом.

Каковы плюсы и минусы помещения данных в А) атрибуты объекта (например, в противном случае пустой класс «формы») или В) просто списки / дикты? Считаете, что я должен сохранить последовательность полей формы, имена полей формы и типы.

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

Ответы [ 5 ]

5 голосов
/ 12 сентября 2010

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

4 голосов
/ 12 сентября 2010

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

Это означает, что нет никакого недостатка (кроме большого количества кода) в использовании классов вообще, и вы никогда не должны бояться писать класс.

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

Полагаю, мое практическое правило для классов: не используйте класс, если вы абсолютно уверены, что к нему нечего добавить. Если нет, просто напишите эти несколько дополнительных строк.

0 голосов
/ 12 сентября 2010

возможно, если вы настроите объект для использования в каждом поле и сохраните его в списке, но это практически закончится как прославленный словарь

, тогда вы можете получить к нему доступ как

fields [2] .name fields [2] .value

ect

0 голосов
/ 12 сентября 2010

Список словарей (например, [{"type": "text", "name": "field_name", "value": "test value"}, ...]) будет полезной структурой, если я правильно понять ваше требование.

Будет ли объект лучше в этом случае, зависит от того, что вы делаете позже. Если вы используете объекты просто как хранилище данных, вы ничего не получите. Может быть, список объектов поля, которые реализуют некоторые подходящие методы для работы с вашими данными, также будет хорошим выбором.

0 голосов
/ 12 сентября 2010

Это не очень Pythonic, чтобы случайным образом добавлять членов к объекту. Было бы более Pythonic, если бы вы использовали методы-члены для этого, но все же не так, как обычно.

Каждая библиотека, которую я видел для такого рода вещей, использует словари или списки. Так что это идиоматически способ Python для решения проблемы. Иногда они используют объект, который переопределяет __getitem__, поэтому он может вести себя как словарь или список, но для доступа к полям используется словарный синтаксис.

Я думаю, что все плюсы и минусы имеют отношение к людям, понимающим ваш код, и, поскольку я никогда не видел код, который обрабатывает это, имея объект с членами, которые могут появляться, я не думаю, что многие найдут код делает это, чтобы быть очень понятным.

...