【问题标题】:Python - Create lists for instances of classPython - 为类的实例创建列表
【发布时间】:2017-05-31 19:13:50
【问题描述】:

我正在制作一个非常简单的待办事项列表应用程序,并且我正在尝试为我的班级的每个实例创建一个列表。我希望有七个列表,每天一个,用于存储任务,但我无法理解它。我正在尝试做的示例:

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=[]))
...

我对 OOP 很陌生,我这样做只是为了尝试提高我的理解力,所以我不确定这是否可能/明智(我只看到有关创建实例列表的问题)。有人可以帮忙吗?

【问题讨论】:

  • 您是否遇到了特定错误?此外,您不需要将第二个参数(列表)括在括号中。
  • @leaf:不,他不是。 (MonList=[],) 将是 tuple。这里的括号是没用的。
  • 当只有一项时,尾随逗号表示一个元组。
  • (1) 您可以从Day() 的构造函数的第二个参数周围删除括号 (2) 您不需要执行MonList=[]TueList=[]。只需简单地传入一个列表:day_Mon = Day('Monday', []) 并且每隔一天都一样。

标签: python list class instance


【解决方案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】:

    这样的事情怎么样?

    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')
    

    构造函数接受两个参数nametodo_list。请注意,todo_list 有一个空列表的默认值。所以创建这个对象的唯一强制参数是name - day_Wed 是一个对象,其中todo_list 属性被初始化为一个空列表。在编写类时,通常会有强制和可选参数。

    【讨论】:

    • 我已经编辑了您的答案,因为您应该使用可变对象作为默认参数。有关说明,请参阅 here
    【解决方案3】:

    您可以将 7 天存储在列表或字典中,但在 OOP 中常见的是定义一个提供有用访问器的容器类。这是一个让您可以通过不区分大小写的名称或数字(假设星期日为 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2014-04-21
      • 2017-12-12
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多