【问题标题】:Attributes from another class not being appended to a list and printed来自另一个类的属性未附加到列表并打印
【发布时间】:2017-09-29 11:05:54
【问题描述】:

所以我很难弄清楚这一点,我做了两门课,一门叫做 Course,一门叫做 Transcript。

我在 Transcript 类中有一个名为“add_course”的方法,它应该将提供给它的课程附加到一个名为“courses”的课程列表中,该列表设置为“self.courses”。

问题是当我在添加一些测试课程后打印 Transcript 类时,它只打印“Transcript:”,没有添加任何内容。

class Course:
    def __init__(self, number, credit, grade):
        #validgrades = ['A','B','C','D','F','IP']
        #if grade not in validgrades:
            #raise CourseError("bad grade" + "'" + grade + "'" )
        self.number = number #string
        self.credit = credit #int
        self.grade = grade #string
    def __str__(self):
        return ('%s: credit %d, grade %s' % (self.number, self.credit, self.grade))
    def __eq__(self,other):
        return self.number==other.number and self.credit==other.credit and self.grade==other.grade
    def is_passing(self):

        if self.grade == 'F' or self.grade == 'IP':
            return False
        else:
            return True
c1 = Course("CS112",4,"A")
print(c1)
print(c1.is_passing())
c2 = Course("ENGH101", 3, "B")
print(c1==c2)
c3 = Course("MATH113", 4, "IP")

class Transcript:

    def __init__(self):
        courses = []
        self.courses = courses


    def __str__(self):
        strtrans=""
        strtrans +='Transcript:\n'
        for i in self.courses:
            strtrans+= '%s\n\t' %(i)
        return strtrans

    def __eq__(self,other):
        if self.courses == other.courses:
            return True
        else:
            return False
    def add_course(self,course):
        for i in self.courses:
            self.courses.append(course)

    def course_by_number(self, number):
        for i.number in self.courses:
            if self.number == number:
                print('It worked!')
                return True
            elif self.number == None:
                return None
            else:
                return False
t=Transcript()
print(t)
t.add_course(c1)
t.add_course(c2)
t.add_course(c3)
print(t)

输出为:

CS112:学分 4,A 级

是的

错误

成绩单:

成绩单:

什么时候应该:

成绩单:

CS112:学分 4,A 级

ENGH101:学分 3,B 级

MATH113:学分 4,IP 等级

【问题讨论】:

  • 一目了然,你的问题可能在这里self.course = self.courses.append(course)你不需要self.course = 追加,修改列表,它不添加和返回
  • 我删除了那个部分,它仍然没有打印任何东西

标签: python class object attributes append


【解决方案1】:

你的问题是

def add_course(self,course):
    for i in self.courses:
        self.course = self.courses.append(course)

您正在迭代self.courses。当此列表为空时,for 循环不会运行,因为没有可迭代的内容。这实际上也会导致无限循环(直到您遇到 MemoryError),因为您正在追加到您正在迭代的同一个列表。

您会看到的另一个问题,如 cmets 中所描述的 @Nullman 是 list.append 返回 None 所以与

self.courses = self.courses.append(course)

在您列出的第一个调用现在是None 之后,第二次调用add_course,它会引发

AttributeError: 'NoneType' object has no attribute 'append'

所以你的函数应该是

def add_course(self,course):
    self.courses.append(course)

【讨论】:

  • 好的,有道理。所以因为 .append 使用就地修改,所以不需要一次又一次地迭代同一个列表,我可以简单地使用 .append?
  • 是的,append会将指定的对象原地添加到列表的末尾。
猜你喜欢
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多