【问题标题】:TypeError: __str__ returned non-string (type NoneType)TypeError: __str__ 返回非字符串(NoneType 类型)
【发布时间】:2018-04-02 18:23:47
【问题描述】:

因此,对于我在 uni 的 Python 课程中的最后一次评估,我必须编写一个由三个对象组成的程序,其中两个是继承的。我一直遇到障碍,尤其是在最后两个对象方面。这是我的代码:

class Course:
    def __init__(self,title="",ID=0):
        self._ID = ID
        self._title = title

    def getID(self):
        return self._ID

    def getTitle(self):
        return self._title

    def setTitle(self,title):
        self._title = title

    def setID(self,ID):
        self._ID = ID

    def __repr__(self):
        return "Title: " + self._title + "ID: " + str(self._ID)

class OfferedCourse(Course):
    def __init__(self,title="",ID=0,enrollment=[]):
        super().__init__(title,ID)
        self._enrollment = len(enrollment)

    def getEnrollment(self):
        return self._enrollment

    def addStudent(self,stu):
        if stu in enrollment:
            print("Student is already enrolled.")
        else:
            enrollment.append(stu)

    def dropStudent(self,stu):
        if stu in enrollment:

    def __repr__(self):
        super().__repr__() + "Enrollment: " + str(self._enrollment)

class StudentCourse(Course):
    def __init__(self,grade,ID=0,title=""):
        super().__init__(title,ID)
        self._grade = grade

    def getGrade(self):
        return self._grade

    def setGrade(self,grade):
        self._grade = grade

    def __repr__(self):
        super().__repr__() + "Grade: " + str(self._grade)   
def main():
#Set primary course
lego=Course("Lego Design",32013)
#display course
print(lego)
#Set OfferedCourse
bonk=OfferedCourse("Matoran History",82932,["Josh","Rick","Greg","Chris"])
#Display OfferedCourse
print(bonk)
#Set StudentCourse
lp=StudentCourse("History of Nu-Metal",57859,82)
#display Student Course
print(lp)

在第 60 行左右,我收到错误消息:
TypeError: str 返回非字符串(NoneType 类型) 我不知道发生了什么。

【问题讨论】:

  • main() 的主体不缩进是故意的吗?
  • 不,我意识到如果没有 main() 你们就没有上下文,我又把它扔进去了。现在一切都解决了。
  • 源代码似乎还是不完整...

标签: python inheritance nonetype


【解决方案1】:

您的__repr__s 没有明确返回任何内容。你建立一个字符串,然后把它扔掉,导致None 被隐式返回。

只需添加一个return

def __repr__(self):
  return super().__repr__() + "Grade: " + str(self._grade) 

【讨论】:

  • 谢谢,但现在的问题是:第 19 行,在 repr 中返回 "Title:" + self._title + "ID:" + str(self._ID) TypeError: must be str, not int 出于某种奇怪的原因,当我输入一个 str() 开始时。编辑:我发现了错误:我的 StudentClass 属性顺序错误!哈!不过还是谢谢!
【解决方案2】:

对原题源代码的调整:

  • def dropStudent(self,stu): 添加缺少的语句
  • def __repr__(self): 添加缺少的return 表达式
  • StudentCourse(Course) init 的签名调整为def __init__(self,title,ID,grade): 以符合父类并按预期处理给定语句StudentCourse("History of Nu-Metal",57859,82)
  • def main(): 添加缺少的缩进

class Course:
    def __init__(self,title="",ID=0):
        self._ID = ID
        self._title = title

    def getID(self):
        return self._ID

    def getTitle(self):
        return self._title

    def setTitle(self,title):
        self._title = title

    def setID(self,ID):
        self._ID = ID

    def __repr__(self):
        return "Title: " + self._title + "ID: " + str(self._ID)

class OfferedCourse(Course):
    def __init__(self,title="",ID=0,enrollment=[]):
        super().__init__(title,ID)
        self._enrollment = len(enrollment)

    def getEnrollment(self):
        return self._enrollment

    def addStudent(self,stu):
        if stu in enrollment:
            print("Student is already enrolled.")
        else:
            enrollment.append(stu)

    def dropStudent(self,stu):
        if stu in enrollment:
            print("@todo Something is missing here...")

    def __repr__(self):
        return super().__repr__() + "Enrollment: " + str(self._enrollment)

class StudentCourse(Course):
    def __init__(self,title,ID,grade):
        super().__init__(title,ID)
        self._grade = grade

    def getGrade(self):
        return self._grade

    def setGrade(self,grade):
        self._grade = grade

    def __repr__(self):
        return super().__repr__() + "Grade: " + str(self._grade)

def main():
    #Set primary course
    lego=Course("Lego Design",32013)
    #display course
    print(lego)
    #Set OfferedCourse
    bonk=OfferedCourse("Matoran History",82932,["Josh","Rick","Greg","Chris"])
    #Display OfferedCourse
    print(bonk)
    #Set StudentCourse
    lp=StudentCourse("History of Nu-Metal",57859,82)
    #display Student Course
    print(lp)

main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2021-11-09
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多