【问题标题】:Problem with simple Inheritance for class representing arithmetic expressions表示算术表达式的类的简单继承问题
【发布时间】:2021-12-28 00:40:51
【问题描述】:

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

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 类中重写它。

【问题讨论】:

    标签: python abstract-class multiple-inheritance abstract-methods


    【解决方案1】:

    我追踪了你的代码,发现这个错误发生的原因最终是因为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

    【讨论】:

      【解决方案2】:

      我不确定您为什么要在修复基本问题之前添加如此多的复杂性,但这是正在发生的事情:

      • 你调用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

      None 被传回,然后当 Pomnoz.Oblicz() 尝试执行它时乘法失败,因为它无法将 None 与整数相乘。

      如果您使用的是带有调试器的 IDE,您可以通过在代码调用更多函数时单步执行代码来跟踪它 - 考虑使用 PyCharm、Spyder、VSCode 或任何其他或具有调试功能的编辑器或 IDE .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        相关资源
        最近更新 更多