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

OOP场景下Questionare类为何返回None而非预期值?

为何方法内部打印的年龄正常,但最终返回None?

原代码

class Questionare:
    def ask_age(self):
        try:
            age = int(input('Type your age after the arrow -> '))
            self.age = age
            print(['inside'], self.age)
            return self.age
        except ValueError:
            print('Only use numbers to inform your age!')
            self.ask_age()

    def __init__(self):
        self.age = self.ask_age()
        print(['__init__'], self.age)

if __name__ == '__main__':
    user_data = Questionare()
    print(['outside'], user_data.age)

运行输出

Type your age after the arrow -> a
Only use numbers to inform your age!
Type your age after the arrow -> 12
['inside'] 12
['__init__'] None
['outside'] None

问题根源

问题出在ask_age方法的异常处理分支:

  • 第一次输入非数字触发ValueError时,进入except块调用self.ask_age()递归请求输入。
  • 第二次输入正确年龄后,递归的ask_age会正常设置self.age并返回12,但这个返回值没有被外层的第一次ask_age调用传递出去——外层的ask_age执行完self.ask_age()后没有return语句,默认返回None。
  • __init__里通过self.age = self.ask_age()赋值,会把第一次ask_age返回的None覆盖掉递归中已经设置好的self.age,最终导致外部获取到的是None。

修复方案

方案1:补充递归调用的返回传递

在except块里加上return,把递归调用的返回值传递出去:

class Questionare:
    def ask_age(self):
        try:
            age = int(input('Type your age after the arrow -> '))
            self.age = age
            print(['inside'], self.age)
            return self.age
        except ValueError:
            print('Only use numbers to inform your age!')
            return self.ask_age()  # 传递递归的返回值

    def __init__(self):
        self.age = self.ask_age()
        print(['__init__'], self.age)

if __name__ == '__main__':
    user_data = Questionare()
    print(['outside'], user_data.age)

方案2:用循环代替递归(更稳妥)

避免递归深度限制问题,改用循环实现输入校验:

class Questionare:
    def ask_age(self):
        while True:
            try:
                age = int(input('Type your age after the arrow -> '))
                self.age = age
                print(['inside'], self.age)
                return self.age
            except ValueError:
                print('Only use numbers to inform your age!')

    def __init__(self):
        self.age = self.ask_age()
        print(['__init__'], self.age)

if __name__ == '__main__':
    user_data = Questionare()
    print(['outside'], user_data.age)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:50:27