Создание списка задач с использованием Python ООП

#python #oop

#python #ооп

Вопрос:

Итак, я начал изучать ООП в Python. У меня простая задача создания ToDoList. Мне не нужно ничего сохранять в текстовом файле или другом формате. Это тестовый код, который должен работать с моей программой:

 mylist = ToDoList('My sample ToDoList')
for i in range(1, 11):
   task = Task(f'Simple task #{i}')
   if i % 2:
       task.finish()
   mylist.add_task(task)
mylist.print_list()
 

И это ожидаемый результат:

 My sample ToDoList
###
[x] Simple task #1
[ ] Simple task #2
[x] Simple task #3
[ ] Simple task #4
[x] Simple task #5
[ ] Simple task #6
[x] Simple task #7
[ ] Simple task #8
[x] Simple task #9
[ ] Simple task #10
 

На данный момент мой код выглядит следующим образом:

 class ToDoList(object):
    def __init__(self, name):
        self.n = name
        print(name,"n","#################")
        self.d = None
    def add_task(self, dic):
        self.d = dic
    def print_list(self):
        for i in self.d:
            if self.d[i] == 'undone':
                print("[ ]"   str(i))
            elif self.d[i] == 'done':
                print("[x]"   str(i))

class Task:
    tasks = {}
    def __init__(self, task):
        self.t = task
        print(task)
        self.tasks[task] = 'undone'

    def finish(self):
        self.tasks[task] = 'done'


mylist = ToDoList('My simple ToDoList')
for i in range(1, 11):
    task = Task(f'Simple task #{i}')
    if i % 2:
        task.finish()
    mylist.add_task(task)
mylist.print_list()
 

И это результат моего кода на данный момент:

 My simple ToDoList 
 #################
Simple task #1
Simple task #2
Simple task #3
Simple task #4
Simple task #5
Simple task #6
Simple task #7
Simple task #8
Simple task #9
Simple task #10
 

Прямо сейчас я застрял. У меня есть часть, в которой я создаю свой словарь невыполненных задач, а затем меняю значения на done . Я хочу передать этот словарь в свой класс ToDoList и просто распечатать ключи и значения. Я чувствую, что решение действительно простое, но, похоже, я не могу его найти. Я с радостью приму любой совет по оптимизации кода.

Ответ №1:

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

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

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

Пример:

 class Task:
    def __init__(self, name):
        self.name = name
        self.done = False

task_list = []
for id in range(1, 11):
    task = Task(f"Simple task #{id}")
    if id % 2 == 0:
        task.done = True
    task_list.append(task)
         
for task in task_list:
    print(f"[{'X' if task.done else ' '}] {task.name}")
 

Вывод:

 [ ] Simple task #1
[X] Simple task #2
[ ] Simple task #3
[X] Simple task #4
[ ] Simple task #5
[X] Simple task #6
[ ] Simple task #7
[X] Simple task #8
[ ] Simple task #9
[X] Simple task #10
 

Комментарии:

1. Спасибо! Ваш пример действительно помог мне разобраться в этом.