我在用算术表达式实现简单的类层次结构时遇到问题。
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
初始化wy1
、wy2
的问题,还是表示这些表达式的想法完全错误。我试着从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
。