Python类继承实现算术表达式出现NoneType运算错误如何解决
问题解决方案
报错根因
- 核心错误出在
Zmienna类的逻辑设计:你在初始化时传入了变量名klucz,但没有将该值赋值给实例的zmienna属性,导致zmienna始终保持类属性的默认空值"" - 调用
Zmienna.Oblicz()方法时,self.slownik.get(self.zmienna)查询空字符串对应的取值,返回None,后续运算时出现None和整数计算的类型错误 - 额外问题:
Zmienna的slownik设为类属性会导致所有变量实例共享同一个字典,不同变量实例的取值会互相干扰,不符合变量独立存储的设计预期;Operator类提前声明的类属性w1、w2无实际作用,属于Java写法迁移到Python的冗余代码
修正后的代码
from abc import ABC, abstractmethod class Wyrazenie(ABC): @abstractmethod def Oblicz(self): pass class Operator(Wyrazenie): def __init__(self, wy1, wy2): self.w1 = wy1 self.w2 = wy2 class Zmienna(Wyrazenie): def __init__(self, klucz, wartosc): self.zmienna = klucz self.wartosc = wartosc def Oblicz(self): return self.wartosc class Stala(Wyrazenie): def __init__(self, wartosc1): self.wartosc = wartosc1 def Oblicz(self): return self.wartosc class Dodaj(Operator): def __init__(self, wy1=None, wy2=None): super().__init__(wy1, wy2) def Oblicz(self) -> int: return self.w1.Oblicz() + self.w2.Oblicz() class Odejmij(Operator): def __init__(self, wy1=None, wy2=None): super().__init__(wy1,wy2) def Oblicz(self) -> int: return self.w1.Oblicz() - self.w2.Oblicz() class Pomnoz(Operator): def __init__(self, wy1=None, wy2=None): super().__init__(wy1,wy2) def Oblicz(self) -> int: return self.w1.Oblicz() * self.w2.Oblicz() class Podziel(Operator): def __init__(self, wy1=None, wy2=None): super().__init__(wy1,wy2) def Oblicz(self) -> int: return self.w1.Oblicz() / self.w2.Oblicz() z1=Zmienna("x", 4) z2=Zmienna("y", 10) # 4 * 10 + 10 - 5 = 45 wyr = Dodaj(Pomnoz(z1, Stala(10)), Odejmij(z2, Stala(5))) print("Wartosc wyrazenia= \n") print(wyr.Oblicz())
验证结果
运行修正后的代码,会输出预期结果45,表达式计算逻辑正常。
内容的提问来源于stack exchange,提问作者user3231387
相关产品推荐
相关产品推荐

