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类内部,实例化时只需要传入原始文本即可,不需要外部提前计算统计值:
- 删除
__init__中非法的return main语句,把程序启动逻辑放到标准脚本入口 - 重构
__init__方法:接收原始文本作为入参,初始化统计计数器,调用内部统计方法完成指标计算 - 拆分统计方法、等级计算方法为类的独立方法,避免逻辑堆积在构造函数中
修复后的可运行代码:
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
相关产品推荐
相关产品推荐

