如何更新子类继承的self.B属性值?为何异常提示中值未变更?
问题
我编写了如下Python代码,包含Parent父类和Child子类,子类继承父类的A、B两个属性。子类的enter_prompt方法用于更新父类初始值为0的self.B属性:当调用该方法时,应将self.B改为用户输入的新值。但目前输入非法值时,except块的print语句中self.B仍显示初始值0,输入合法值后才会更新。请问如何让异常提示中的B显示输入的值?为何输入值后self.B未即时变更?
代码如下:
class Parent: def __init__(self, A: str, B = 0): self.A = A self.B = B class Child(Parent): def __init__(self, A: str, B = 0): super().__init__(A, B) def enter_prompt(self): while True: try: self.B = float(input('Please enter a numerical value: ')) except ValueError: print(f"Item A {self.A}'s new value B {self.B} must be a numerical value, please try again!") else: break print(f"Item A {self.A}'s new value is {self.B}.") return self.A, self.B
运行代码:
P = Parent('Alpha', 0) C = Child(P.A, P.B) C.enter_prompt()
终端输出:
Please enter a numerical value: www Item A Alpha's new value B 0 is not a new numerical value, please try again! Please enter a numerical value: 15.5 Item A Alpha's new value is 15.5.
我原本以为输入值后self.B会立即变更并在提示字符串中显示,不知该如何解决此问题,求指点。
分析与解决方法
问题根源
输入非法值时,float(input(...))会直接触发ValueError,这时候赋值给self.B的操作根本没执行,所以self.B还是原来的初始值0。只有当输入能成功转成float类型时,赋值语句才会完成,self.B才会更新。
解决办法
要在异常提示里显示用户输入的非法值,得先把用户输入的内容存到一个临时变量里,再尝试转换:
- 先获取用户输入并保存到临时变量
- 尝试将临时变量转为float,成功后再赋值给self.B
- 抛出异常时直接用这个临时变量来提示
修改后的代码:
class Parent: def __init__(self, A: str, B = 0): self.A = A self.B = B class Child(Parent): def __init__(self, A: str, B = 0): super().__init__(A, B) def enter_prompt(self): while True: input_val = input('Please enter a numerical value: ') try: self.B = float(input_val) except ValueError: print(f"Item A {self.A}'s input value '{input_val}' is not a numerical value, please try again!") else: break print(f"Item A {self.A}'s new value is {self.B}.") return self.A, self.B
测试结果
运行修改后的代码,输入非法值时会正确显示用户输入的内容:
Please enter a numerical value: www Item A Alpha's input value 'www' is not a numerical value, please try again! Please enter a numerical value: 15.5 Item A Alpha's new value is 15.5.
内容的提问来源于stack exchange,提问作者CYU1
相关产品推荐
相关产品推荐

