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

Python自定义类实例返回main函数方法及初始化报错修复

错误根因

两个报错对应的代码问题非常明确:

  • __init__方法非法返回值:Python规定类的构造方法__init__只能返回None,当前代码在__init__末尾写了return main,直接返回了函数对象,触发TypeError: __init__() should return None, not 'function'报错。
  • 实例化参数不匹配:当前__init__方法定义要求传入text_num、space_count、marks_count三个位置参数,但main函数中实例化时写的是Read(),没有传入任何参数,触发缺参数的报错。
  • 结构缩进错误:return main被缩进在Read类内部,属于无效语法逻辑,main函数本身没有被正确触发的入口。
  • 类设计不符合需求:当前类完全没有承载文本读取、指标统计的逻辑,只是被动接收外部计算好的统计值,和“用面向对象方式实现文本分析”的目标不符。
修复方案

核心调整思路是把文本统计、指数计算的逻辑封装到Read类内部,实例化时只需要传入原始文本即可,不需要外部提前计算统计值:

  1. 删除__init__中非法的return main语句,把程序启动逻辑放到标准脚本入口
  2. 重构__init__方法:接收原始文本作为入参,初始化统计计数器,调用内部统计方法完成指标计算
  3. 拆分统计方法、等级计算方法为类的独立方法,避免逻辑堆积在构造函数中

修复后的可运行代码:

import cs50

class Read():
    def __init__(self, input_text):
        # 存储原始输入文本
        self.text = input_text
        # 初始化三类统计计数器
        self.letter_count = 0
        self.word_count = 0
        self.sentence_count = 0
        # 实例化时自动完成指标统计
        self._count_metrics()

    def _count_metrics(self):
        # 统计有效字母数:仅统计大小写英文字母
        for c in self.text:
            if c.isalpha():
                self.letter_count += 1
        # 统计单词数:用空格分割计数,兼容多空格、首尾空格场景,比直接数空格更鲁棒
        self.word_count = len(self.text.split())
        # 统计句子数:按.?!三类句末标点计数
        for c in self.text:
            if c in ['.', '?', '!']:
                self.sentence_count += 1

    def get_grade_level(self):
        # 计算每百词平均字母数、每百词平均句子数
        l = self.letter_count / self.word_count * 100
        s = self.sentence_count / self.word_count * 100
        # 代入Coleman-Liau指数公式
        index = round(0.0588 * l - 0.296 * s - 15.8)
        # 处理年级边界
        if index < 1:
            return "Before Grade 1"
        elif index >= 16:
            return "Grade 16+"
        else:
            return f"Grade {index}"

def main():
    # 获取用户输入文本
    input_text = cs50.get_string("Text: ")
    # 实例化对象时仅需传入原始文本
    read = Read(input_text)
    # 输出计算结果
    print(read.get_grade_level())

if __name__ == "__main__":
    main()
后续优化方向
  • 增加边界兼容:添加空文本、单词数为0的判断逻辑,避免出现除以0的运行时错误
  • 统计规则可配置:如果后续需要适配不同的标点判定、字符判定规则,可以把规则做成初始化参数传入,不需要修改类内部逻辑
  • 增加属性只读保护:统计完成后的字母数、单词数、句子数不允许外部随意修改,避免计算结果被篡改
  • 不要把程序流程控制语句写在类内部:类只负责封装数据和对应的处理方法,程序启动入口统一放在if __name__ == "__main__"块中,避免模块被导入时自动执行主逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:21:30