gde polimorfizm
unknown
python
a year ago
8.4 kB
2
Indexable
Never
import enum # Библиотека для создания enum() import time # Библиотека для работы со временем import pickle # Библиотека для сохранения и загрузки class FileManager: # Класс отвечающий за сохранение и загрузку данных в память программы path = "saveload.txt" try: # Если файла нет, создаем его open(path, "r") except FileNotFoundError: open(path, "w+") def save(self, list_of_tasks): # Метод сохраняющий данные file = open(self.path, "wb") pickle.dump(list_of_tasks, file) def load(self): # Метод загружающий в память сохраненные данные file = open(self.path, "rb") try: # Проверка на то, не пустой ли файл return pickle.load(file) except EOFError: return list() class Operation(enum.Enum): # Содержит в себе имена команд, устанавливает четкое соответствие между номером команды и именем addTask = 1 viewTask = 2 viewListOfTasks = 3 deleteTask = 4 findTask = 5 exit = 6 def __str__(self): title = "" match self: case Operation.addTask: title = "Создать задачу" case Operation.viewTask: title = "Посмотреть задачу" case Operation.viewListOfTasks: title = "Посмотреть список задач" case Operation.deleteTask: title = "Удалить задачу" case Operation.findTask: title = "Найти задачу" case Operation.exit: title = "Выйти из программы" return f"{self.value}. {title}" class Task: # Класс задач, содержит в себе структуру задачи def __init__(self, heading, body, date, tags): self.heading = heading self.body = body self.date = date self.tags = tags # Выводит информацию о задаче def print_task(self, number_of_task): # Метод для вывода полной информации о задаче print("\nЗадача №" + str(number_of_task)) print("Заголовок: " + self.heading) print("Задача: " + self.body) print("Дата дедлайна: " + time.strftime("%H:%M %d/%m/%Y", self.date)) print("Теги: " + ", ".join(self.tags)) def print_short_task(self, number_of_task): # Метод для вывода краткой информации о задаче print("\nЗадача №" + str(number_of_task)) print("Заголовок: " + self.heading) print("Дата дедлайна: " + time.strftime("%H:%M %d/%m/%Y", self.date)) class Menu: # Класс отвечающий за вывод меню в командную строку options = [Operation.addTask, Operation.viewTask, Operation.viewListOfTasks, Operation.deleteTask, Operation.findTask, Operation.exit] def print_menu(self): print("") for option in self.options: print(option) class ToDoList: # Класс содержащий основную логику программы def __init__(self, list_of_tasks): self.list_of_tasks = list_of_tasks def get_date(self): # Метод отвечающий за получение даты в корректном формате date = "" while date == "": date = input("Дата (hh:mm dd/mm/yyyy): ") try: date = time.strptime(date, "%H:%M %d/%m/%Y") except ValueError: print("Неверная дата, повторите попытку") date = "" return date def get_operation(self): # Метод отвечающий за получение команд от пользователя try: operation = Operation(int(input("\nДействие: "))) return operation except ValueError: print("Такого пункта меню не существует") def add_task(self): # Метод позволяющий создавать задачи task_heading = input("Введите заголовок задачи: ") task_description = input("Введите задачу: ") task_date = self.get_date() task_tags = [] tag = input("Вводите теги, когда закончите - нажмите Enter: ") while tag != "": task_tags.append(tag) tag = input("Введите тег: ") task = Task(task_heading, task_description, task_date, task_tags) self.list_of_tasks.append(task) file_manager.save(self.list_of_tasks) def delete_task(self): # Метод позволяющий удалять задачи try: task_number = int(input("Введите номер задачи: ")) if task_number > len(self.list_of_tasks) or task_number < 1: print("\nЗадача с таким номером не обнаружена") else: self.list_of_tasks.pop(task_number - 1) file_manager.save(self.list_of_tasks) print("\nЗадача №" + str(task_number) + " удалена") except ValueError: print("\nЗадача с таким номером не обнаружена") def view_task(self): # Метод выводящий задачу try: number_of_task = int(input("Введите номер задачи: ")) if number_of_task > 0: self.list_of_tasks[number_of_task - 1].print_task(number_of_task) else: print("\nЗадача с таким номером не обнаружена.") except (IndexError, ValueError): print("\nЗадача с таким номером не обнаружена.") def view_list_of_task(self): # Метод выводящий весь список задач if len(self.list_of_tasks) == 0: print("Задач нет.") else: for task_number in range(len(self.list_of_tasks)): self.list_of_tasks[task_number].print_short_task(task_number + 1) def find_task(self): # Метод осуществляющий поиск задачи по тегу if len(self.list_of_tasks) < 1: print("\nУ вас нет ни одной задачи") else: tag_to_find = input("Введите тег: ") for i in range(len(self.list_of_tasks)): if tag_to_find in self.list_of_tasks[i].tags: self.list_of_tasks[i].print_task(i + 1) break else: print("\nЗадачи с таким тегом не обнаружено") operation = None file_manager = FileManager() to_do_list = ToDoList([]) my_menu = Menu() to_do_list.list_of_tasks = file_manager.load() while operation != Operation.exit: my_menu.print_menu() operation = to_do_list.get_operation() # Получение номера операции # Создание задачи if operation == Operation.addTask: to_do_list.add_task() # Просмотр задачи if operation == Operation.viewTask: to_do_list.view_task() # Просмотр списка задач if operation == Operation.viewListOfTasks: to_do_list.view_list_of_task() # Удаление задачи if operation == Operation.deleteTask: to_do_list.delete_task() # Поиск задачи if operation == Operation.findTask: to_do_list.find_task() print("Выход из программы")