You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python课程作业报错:__str__返回非字符串(NoneType)求助

解决 TypeError: __str__ returned non-string (type NoneType) 问题

嘿,我刚碰到过一模一样的坑!这个错误的核心原因特别明确:你的某个类的__str__(或者__repr__)方法没有返回字符串类型的值——要么是完全没写return语句(默认返回None),要么是返回的表达式出了问题(比如拼写错误导致变量不存在,或者拼接了非字符串类型却没转换)。

先看你给出的Course类代码片段,里面的__repr__明显没写完——return "Title: " + sel...这里的sel应该是self吧?而且只拼接了标题,最好把ID也加上,还要确保返回的是完整字符串。我们先把这个类补全修正:

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):
        # 用f-string确保返回字符串,同时包含所有关键属性
        return f"Course(Title: '{self._title}', ID: {self._ID})"
    
    # 要是需要更友好的打印输出,可以定义__str__
    def __str__(self):
        return f"课程: {self._title} (ID: {self._ID})"

接下来看你卡壳的两个继承类,大概率是你在它们的__str__或__repr__里犯了下面这些错:

  • 忘记写return语句,比如用print()代替return(print只是输出到控制台,不会返回字符串)
  • 变量名拼写错误(比如把self写成sel),导致表达式报错或者返回None
  • 拼接字符串时混合了非字符串类型(比如直接把数字ID和字符串拼接,没转成str(ID))

举个你可能踩过的错误子类例子:

# 错误写法!__str__没有return,默认返回None
class UndergradCourse(Course):
    def __init__(self, title="", ID=0, credits=3):
        super().__init__(title, ID)
        self._credits = credits
    
    def __str__(self):
        # 这里用了print而不是return,会触发错误
        print(f"本科课程: {self._title}, ID: {self._ID}, 学分: {self._credits}")

修正后的子类写法:

class UndergradCourse(Course):
    def __init__(self, title="", ID=0, credits=3):
        super().__init__(title, ID)
        self._credits = credits
    
    def __str__(self):
        # 明确return一个字符串
        return f"本科课程: {self._title}, ID: {self._ID}, 学分: {self._credits}"
    
    def __repr__(self):
        # 同样确保__repr__返回字符串,方便调试
        return f"UndergradCourse(Title: '{self._title}', ID: {self._ID}, Credits: {self._credits})"

最后给你几个排查小技巧:

  1. 检查所有子类的__str__和__repr__方法,确保每个方法都有return语句
  2. 拼接字符串优先用f-string(自动处理类型转换,不容易出错)
  3. 可以单独调用str(你的对象)或者repr(你的对象)来测试,定位到底是哪个类的方法出问题

内容的提问来源于stack exchange,提问作者JoshMerMun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:40:11