表示算术表达式的类的简单继承问题



我在用算术表达式实现简单的类层次结构时遇到问题。

TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

其他运算、加法、减法、除法等也是如此。

我的代码:

from abc import ABC, abstractmethod
class Wyrazenie(ABC):
# @abstractmethod
def Oblicz(self):
pass

class Operator(Wyrazenie):
w1 = Wyrazenie()
w2 = Wyrazenie()
def __init__(self, wy1, wy2):
self.w1 = wy1
self.w2 = wy2
#def Oblicz(self) -> int:
#    pass

class Zmienna(Wyrazenie):
zmienna=""
slownik={}
def __init__(self, klucz, wartosc):
self.slownik.update({klucz: wartosc})
def Oblicz(self):
return self.slownik.get(self.zmienna)

class Stala(Wyrazenie):
wartosc=0
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)))
wyr.Oblicz()
print("Wartosc wyrazenia=   n")
print(wyr.Oblicz())

我不知道是用None初始化wy1wy2的问题,还是表示这些表达式的想法完全错误。我试着从Java类中重写它。

我不知道为什么在修复一些基本的东西之前要添加这么多复杂的东西,但下面是发生的事情:

  • 您调用wyr.Oblicz(),即Dodaj.Oblicz()(顺便说一句,用大写字母命名方法是个坏主意,因为它看起来像一个类,所以非常令人困惑(
  • 它在尝试将结果与其他值求和之前调用self.w1.Oblicz(),它是传递给Dodaj(Pomnoz(z1, Stala(10)), Odejmij(z2, Stala(5)))的第一个参数的Oblicz(),因此Pomnoz.Oblicz()
  • 在尝试将结果与其他内容相乘之前,它调用self.w1.Oblicz(),并且它是Pomnoz的第一个参数,即zi,它就是Zmienna("x", 4),所以Zmienna.Oblicz()
  • 它调用self.slownik.get(self.zmienna),但由于self.zmienna"",并且self.slownik中没有""的条目,因此它返回None

Pomnoz.Oblicz()尝试执行时,None会被传递回来,并且乘法会失败,因为它无法将None与整数相乘。

如果你使用的是带有调试器的IDE,你可以自己跟踪它,在它调用更多函数时进入代码-考虑使用PyCharm、Spyder、VSCode或任何其他工具,或者编辑器或具有调试功能的IDE。

我追踪了您的代码,发现出现此错误的原因最终是因为Zmienna.Oblicz返回None

调用wyr.Oblicz()如下所示:

wyr (Dodaj) .Oblicz ->
wyr.w1 (Pomnoz) .Oblicz ->
wyr.w1.w1 (z1) (Zmienna) .Oblicz ->
self (Zmienna) .slownik.get(self.zmienna) ->
this call returned None

在调用slownik.get时,slownik是包含{'x': 4, 'y': 10}dict,而self.zmienna是包含""str

最新更新