@toxowa

Вопросы по классам. Инициализация? Сохранение? Загрузка? Наследование?

Доброго времени суток! Есть несколько вопросов, касательно классов. И да, гугл не помог.. Т.к. рассматриваемые примеры слишком простые. Что-то вроде в примерах задачки 2+2=4, а на деле - взять производные и тд.
Начну по нарастающей.
На примере студентов и групп.
1) Я знаю, как создавать отдельно классы студентов и отдельно групп.
class Student:
    def __init__(self, name1, name2, group):
        self.name = name
        self.name2= name2
        self.group= group
     def какие-то функции.

Но вот уже на этапе создание группы я явно что-то не так делаю.. И скорее всего можно сначала создать класс "группа", а потом уже по нисходящей создавать класс "студент", который наследует группу.. Но я не знаю, как с этим работать и сделал бы так, создав список со всеми экземплярами студентов..

group1[1] = new Student(), group1[2] = new Student()

затем бы перебором всех находил бы нужного. Это же не верный вариант? И можно как-то намного проще это сделать?
Четче поставлю вопрос.. Как создать классы групп и студентов? Как их хранить и потом обращаться к ним?

2) Когда нужно сохранять классы я создаю метод, который каким-то образом собирает все переменные и создаю что-то вроде json'a для каждого экземпляра класса. Создаю его явно и вручную, что-то вроде
{
  "name": self.name
  "name2": self.name2
}

А потом уже либо переводя в строку записываю в файл, либо в бд для каждой переменной своя ячейка.
Когда загружаю либо беру данные из файла и перевожу их обратно в json или паршу, если например не в json'e хранил данные. Либо получаю данные из бд. Затем уже, как в 1-ом пункте в цикле создаю.
Получается как-то монотонно и при малейших изменениях приходится редактировать сначала преобразование класса, затем его сохранение куда-то, а потом и загрузку. Каждый раз переписывая кучу переменных. Есть ли куда лаконичнее и проще варианты?
  • Вопрос задан
  • 301 просмотр
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
tsarevfs
@tsarevfs
C++ developer
1. Студент не должен наследовать группу. Наследование не про это.
Вы можете представить группу просто как массив студентов, как в вашем примере.
group1 = []
group.append(Student("ivan", "perov"))
group.append(Student("petr", "ivanov"))


Если у группы появится какая-то интересная логика, например согранение\загрузка, то можно завести для нее класс.
class Group:
    def __init__(self):
        self.students = []

    def add_student(self, name, surname):
        self.students.append(name, surname, self)

group = Group()
group.add_student("ivan", "perov")
group.add_student("petr", "ivanov")


Для доступа к студентам можно добавить функции геттеры, которые возвращают или весь массив или конкретных студентов по номеру или имени.

2. Сериализация и десериализация почти всегда требует монотонных действий. Не рекомендуется реализовывать ее самостоятельно. Для того же json есть встроенная библиотека. Для баз данных так же есть orm библиотеки(SQLAlchemy, Django ORM, peewee).
В python есть pickle которая умеет самостоятельно сохранять и загружать объекты в свой формат. Но она относительно медленная и опасная.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы