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
相关产品推荐
相关产品推荐

