Python面向对象中子类调用方法执行减法返回None的问题
子类结构下减法运算返回None的问题排查与修复
核心故障定位
返回值为None且全程无运行报错,本质是decide()方法没有命中任何有效返回分支,和子类的继承实现没有关系:
- 程序中通过
input()获取的用户选项是字符串类型,但Calc_1类的decide方法是和整数类型的1、2做相等判断。比如你输入选项2,实际传入方法的是字符串"2",和整数2永远无法匹配,两个判断分支都不会执行。 - Python中所有未显式执行return语句的函数,会默认返回
None,这就是结果始终为None的直接原因。 - 你的子类
Calc_2的继承逻辑本身没有问题:通过super()正确调用了父类构造方法,完整继承了父类的add、subtract、decide方法,不存在属性丢失、方法重写异常的问题,完全不需要在子类里重新实现减法逻辑。很多开发者遇到这个问题会误以为是子类继承失效,跑去子类里重写减法方法,其实属于无效修改,父类已经实现了可正常运行的减法逻辑。
针对性修复方案
1. 修正分支判断的类型匹配问题
在decide方法内部对传入的选择值做类型转换,兼容字符串输入的场景,确保分支判断能正常命中:
def decide(self, choice): # 统一将输入的选项转成整数再判断 choice = int(choice) if choice == 1: return self.add() if choice == 2: return self.subtract()
2. 补全分支兜底逻辑
将独立的if判断调整为if-elif结构,增加异常分支处理,从根源上避免漏走返回分支导致返回None:
def decide(self, choice): choice = int(choice) if choice == 1: return self.add() elif choice == 2: return self.subtract() elif choice == 3: return math.cos(self.num1) elif choice == 4: return math.sin(self.num1) else: print("无效计算选项") return None
3. 修正输出格式的硬编码问题
当前的print语句硬编码了"{} - {} = "的减法格式,就算用户选了加法、余弦计算,输出文案也和实际计算不匹配。可以在decide方法中同步返回计算对应的符号,动态调整输出内容。
修复后可正常运行的参考代码
import math class Calc_1: def __init__(self, num1, num2): self.num1 = num1 self.num2 = num2 def add(self): return self.num1 + self.num2 def subtract(self): return self.num1 - self.num2 def decide(self, choice): choice = int(choice) if choice == 1: return self.add(), "+" elif choice == 2: return self.subtract(), "-" elif choice == 3: return math.cos(self.num1), "cos" elif choice == 4: return math.sin(self.num1), "sin" else: return None, "无效选项" class Calc_2(Calc_1): def __init__(self, num1=None, num2=None): super().__init__(num1, num2) print("1. Add multiple numbers") print("2. Subtraction") print("3. Find Cosine") print("4. Find Sine") print("5. Quit","\n") choice = input("Please make your choice: ") print() if int(choice) == 5: print("程序退出") exit() a = float(input("Enter first num: ")) b = float(input("Enter second num: ")) calc = Calc_2(a,b) result, op = calc.decide(choice) if op in ["cos", "sin"]: print(f"{op}({calc.num1}) = ", result) else: print (f"{calc.num1} {op} {calc.num2} = ", result)
内容的提问来源于stack exchange,提问作者Krys Tof
相关产品推荐
相关产品推荐

