Python中TypeError: 'str' object is not callable错误排查与解决
解决TypeError: 'str' object is not callable并实现TreasureChest类功能
错误原因分析
这个报错的核心原因是你在代码中把某个函数名当成字符串变量赋值了,之后尝试调用这个"函数"时,实际调用的是字符串,自然会触发TypeError。比如如果出现过类似readData = "treasure_data.txt"这样的代码,之后再执行readData()就会报错。
完整实现代码
下面是符合需求的代码,包含私有属性、文件读取、异常处理,同时避免了命名冲突:
class TreasureChest: def __init__(self, question, answer, points): # 定义私有属性 self.__question = question self.__answer = answer self.__points = points # 可选:添加获取私有属性的方法(如果需要外部访问) def get_question(self): return self.__question def get_answer(self): return self.__answer def get_points(self): return self.__points def read_treasure_data(file_path): arrayTreasure = [] try: with open(file_path, 'r', encoding='utf-8') as file: for line in file: # 分割每行数据,假设数据用逗号分隔(可根据实际分隔符调整) parts = line.strip().split(',') if len(parts) != 3: print(f"无效数据行:{line},跳过") continue # 转换数据类型 question = parts[0].strip() try: answer = int(parts[1].strip()) points = int(parts[2].strip()) except ValueError: print(f"数据类型错误:{line},跳过") continue # 创建TreasureChest对象并加入数组 chest = TreasureChest(question, answer, points) arrayTreasure.append(chest) except FileNotFoundError: print(f"错误:未找到文件 {file_path}") return arrayTreasure # 调用示例 if __name__ == "__main__": treasure_list = read_treasure_data("TreasureChestData.txt") # 验证结果 for chest in treasure_list: print(f"问题:{chest.get_question()},答案:{chest.get_answer()},分值:{chest.get_points()}")
关键注意事项
- 避免命名冲突:不要将函数名(比如
read_treasure_data)和变量名重名,这是触发你报错的核心原因。比如不要写read_treasure_data = "some string"再去调用read_treasure_data()。 - 文件格式兼容:假设文件每行数据用逗号分隔,比如
"什么是Python的官方解释器?",1,10,如果你的文件用其他分隔符(比如空格、制表符),需要修改split()的参数。 - 数据类型校验:添加了
ValueError捕获,防止文件中答案或分值不是整数的情况。 - 私有属性访问:Python中私有属性是通过名称修饰实现的,外部无法直接访问
__question,所以提供了get_*方法来获取属性值(如果不需要外部访问可以省略)。
内容的提问来源于stack exchange,提问作者Ayush Rai
相关产品推荐
相关产品推荐

