我有一个类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。
- F 字符串使您的代码更具可读性
- 可以使用
enumerate
循环访问带有计数器的列表
__repr__
__str__
是计算对象的"官方"字符串表示形式的内置方法
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()