2017-01-16 2 views
1

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

class Day: 
    def __init__(self, name, todo_list): 
     self.name = name 
     self.todo_list = todo_list 

day_Mon = Day('Monday', (MonList=[])) 
day_Tue = Day('Tuesday', (TueList=[])) 
... 

Я очень новой для объектно-ориентированного программирования, и я просто делаю это, чтобы попытаться попробовать улучшить свое понимание, так что я не уверен, если это вообще возможно/разумным (I мы видели только вопросы о создании списков экземпляров). Кто-нибудь может помочь?

+0

Какая у вас ошибка? Кроме того, вам не нужно обертывать свой второй аргумент (список) в круглых скобках. – denvaar

+3

@leaf: нет, он нет. '(MonList = [],)' будет 'tuple'. Здесь скобки просто бесполезны. –

+0

Конечная запятая обозначает кортеж, когда имеется только один элемент. – denvaar

ответ

1

Как насчет этого?

class Day: 
    def __init__(self, name, todo_list=None): 
     self.name = name 
     if todo_list: 
      self.todo_list = todo_list 
     else: 
      self.todo_list = [] 


day_Mon = Day('Monday', ['errands', 'study']) 
day_Tue = Day('Tuesday',['laundry', 'cook']) 
day_Wed = Day('Wednesday') 

Конструктор принимает два аргумента name и todo_list. Обратите внимание: todo_list имеет значение по умолчанию для пустого списка. Таким образом, единственным обязательным аргументом для создания этого объекта является name - day_Wed - это объект, в котором атрибут todo_list инициализирован пустым списком. Обычно при написании классов есть обязательные и необязательные аргументы.

+0

Я отредактировал ваш ответ, потому что вы должны * не * использовать изменяемый объект в качестве аргумента по умолчанию. См. [Здесь] (https://pythonconquerstheuniverse.wordpress.com/2012/02/15/mutable-default-arguments/) для объяснения. –

+0

@RolandSmith благодарит за это. Ред. – sujit

1

Ваш инициализатор может потребовать параметр name и разрешить необязательный todo_list, который по умолчанию представляет собой пустой список.

По причинам, о которых вы должны узнать, но я не буду здесь останавливаться, вы никогда не должны использовать пустой список в качестве значения по умолчанию для параметра функции, поэтому мы будем использовать None, а затем установить нужное значение в __init__ ,

>>> class Day: 
...  def __init__(self, name, todo_list=None): 
...   self.name = name 
...   self.todo_list = todo_list if todo_list else [] 

>>> day_Mon = Day('Monday') 
>>> day_Mon.todo_list 
[] 
>>> day_Tue = Day('Tuesday', ['wash clothes', 'pack']) 
>>> day_Tue.todo_list 
['wash clothes', 'pack'] 
+2

Можете ли вы описать словами, что это вы сделали? –

+0

Питер - обновлен. – Scott

0

Вы можете сохранить 7 дней в списке или словаре, но его общий в ООП определить класс контейнера, который предоставляет полезные аксессоры. Вот один из них, который позволяет вам обращаться к дням недели по нечувствительным к регистру имени или номеру (при условии, что воскресенье равно 0).

import datetime 

class Day: 
    def __init__(self, name, todo_list): 
     self.name = name 
     self.todo_list = todo_list 

class Week: 

    weekday_names = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
     'Friday') 
    weekday_index = {name.lower():idx 
     for idx,name in enumerate(weekday_names)} 
    weekday_index.update({idx:idx for idx in range(7)}) 

    def __init__(self): 
     self.days = [Day(name, []) for name in self.weekday_names] 

    def __getitem__(self, name_or_ord): 
     if isinstance(name_or_ord, str): 
      name_or_ord = name_or_ord.lower() 
     return self.days[self.weekday_index[name_or_ord]] 

    def __setitem__(self, name, day): 
     raise ValueError("Cannot set days in week") 

week = Week() 
week['Sunday'].todo_list.append('dinner with parents') 
week['Monday'].todo_list.append('laundry') 
print("Monday's tasks:", 
    ', '.join(week['monday'].todo_list)) 
print("Today's tasks:", 
    ', '.join(week[datetime.date.today().weekday()].todo_list)) 
Смежные вопросы