gde polimorfizm
unknown
python
3 years ago
8.4 kB
10
Indexable
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("Выход из программы")
Editor is loading...