Python函数间调用时出现AttributeError问题求助
解决AttributeError: 'NoneType' object has no attribute 'name'问题
错误原因
当输入空姓名触发ValueError时,get_student()函数内部调用了main(),但这个递归调用的main()虽然能正常获取合法的Student实例并完成打印,最初的get_student()函数并没有返回这个实例——它执行完main()后就默认返回None。最开始的main()函数中,student变量接收的就是这个None,后续访问student.name自然会抛出AttributeError。
修复方案
方案1:递归调用自身而非main()
修改get_student(),在异常处理块中递归调用自身并返回结果,确保每一层函数都能传递最终的Student实例:
class Student: def __init__(self, name, house): if not name: raise ValueError("Missing name!") self.name = name self.house = house def main(): student = get_student() print(f"{student.name} from {student.house}") def get_student(): name = input("Name: ") house = input("House: ") try: return Student(name, house) except ValueError: print("Please make sure to enter a name...") return get_student() # 递归调用自身并返回结果 if __name__ == "__main__": main()
方案2:用循环替代递归(更稳妥)
递归存在栈溢出风险(多次错误输入会增加调用栈深度),用while True循环直到输入合法更可靠:
class Student: def __init__(self, name, house): if not name: raise ValueError("Missing name!") self.name = name self.house = house def main(): student = get_student() print(f"{student.name} from {student.house}") def get_student(): while True: name = input("Name: ") house = input("House: ") try: return Student(name, house) except ValueError: print("Please make sure to enter a name...") if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Tharindu Dissanayake
相关产品推荐
相关产品推荐

