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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:52:50