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

如何更新子类继承的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:45:36