列出包含类对象的列表的内容无法正常工作



我有一个类task,其中包含任务的信息和扩展它的方法,如下所示:

#define class for tasks
class task:
    def __init__(self, name, date, category):
        self.name = name
        self.date = date
        self.category = category
    def expand(self): # returns the contents of the task
        print(str(self.name) + " is due " + str(self.date))

以及一个函数listTasks(),它列出了包含类任务对象的标准列表的内容,如下所示:

def listTasks():
    i = 1
    for task in data:
        print("%s. %s" % (i, task.expand()))
        i = i+1

这个想法是让listTasks函数显示一个连贯的列表,看起来像

1. Foo is due tomorrow
2. Foobar is due in 2 days
3. FooFoo is due in five years

等等,但实际输出如下所示:

foo is due tomorrow
1. None
foobar is due in 2 days
2. None

谁能帮我理解为什么?

你的函数expand()只是print结果,而不是return它。因此,在循环内部,它被调用并打印行,但返回None然后从循环打印变为i. None

将函数更改为:

def expand(self): # returns the contents of the task
    return str(self.name) + " is due " + str(self.date)

为了使它更具可读性,我还会对循环使用 enumerate,如下所示:

def listTasks():
    for i, task in enumerate(data, 1):
        print("%s. %s" % (i, task.expand()))

正如@Tomerikoo指出的那样,主要问题是您不会返回,而是在expand方法中打印字符串。

但是,我想指出对您的代码的更多可能的改进:

  • 类名应为 CamelCase,函数应根据 PEP8 lower_case_separated_with_underscores。
  • __repr__ __str__ 是计算对象的"官方"字符串表示形式的内置方法
  • F 字符串使您的代码更具可读性
  • 可以使用enumerate循环访问带有计数器的列表
from datetime import datetime

class Task:
    def __init__(self, name, date, category):
        self.name = name
        self.date = date
        self.category = category
    def __str__(self):
        return f"{self.name} is due {self.date}" # you need to return the information

data = [Task("test", datetime.now(), "something"), Task("test2", datetime.now(), "something")]

def list_tasks():
    for i, task in enumerate(data, 1):
        print(f"{i}. {task}")

list_tasks()

最新更新