2017-10-11 30 views
0

CalculatorEngineクラスを次のように再利用してRPN計算機を取得しようとしています。しかし、私がそれを実行すると、属性エラーが表示されます。 'RPNCalculator'オブジェクトには属性 'dataStack'がありません。これをどうすれば解決できますか? (あまりにも多くのコードがあるだろうと私はStackクラスが含まれていませんでした。)Python:RPN Calculator

 class CalculatorEngine(object): 
     def __init__(self): 
      self.dataStack = Stack() 

     def pushOperand(self, value): 
      self.dataStack.push(value) 

     def currentOperand(self): 
      return self.dataStack.top() 

     def performBinary(self, fun): 
      right = self.dataStack.pop() 
      left = self.dataStack.top() 
      self.dataStack.push(fun(left, right)) 

     def doAddition(self): 
      self.performBinary(lambda x, y: x + y) 

     def doSubtraction(self): 
      self.performBinary(lambda x, y: x - y) 

     def doMultiplication(self): 
      self.performBinary(lambda x, y: x * y) 

     def doDivision(self): 
      try: 
       self.performBinary(lambda x, y: x/y) 
      except ZeroDivisionError: 
       print("divide by 0!") 
       exit(1) 

     def doTextOp(self, op): 
      if (op == '+'): 
       self.doAddition() 
      elif (op == '-'): 
       self.doSubtraction() 
      elif (op == '*'): 
       self.doMultiplication() 
      elif (op == '/'): self.doDivision() 


    class RPNCalculator(CalculatorEngine): 
     def __init__(self): 
      super(CalculatorEngine, self).__init__() 

     def eval(self, line): 
      op = line.split(" ") 
      try: 
       for item in op: 
       if item in '+-*/': 
        self.doTextOp(item) 
       elif item in '%': 
        self.performBinary(lambda x, y: x % y) 
       else: 
        self.pushOperand(int(item)) 
       return self.currentOperand() 
      except ZeroDivisionError: 
       print 'divide by 0!' 
+0

残りのコードはどこにありますか(インスタンスの作成と操作、そしてもちろん例外を生成する行)?また、インデントを固定します。 – CristiFati

+0

https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – jdv

答えて

0

class X(object): 
 
    def __init__(self, name): 
 
    self._name = name 
 

 
    def doit(self, bar): 
 
    print("Hello") 
 

 
class Y(X): 
 
    def __init__(self): 
 
    # super(X, self).__init__() 
 
    X.__init__(self, "DDXX") 
 

 

 
i = X("Yuze") 
 
j = Y()

それともあなたはそれを修正するために、このスニペットを使用することができます。

+0

はい、私はしました。私はそれが私に投稿を許可しないという理由でコードを追加しなかった: – Tiffy

+0

これは答えも正確でもない。 – CristiFati

+0

私は参照してください。私はそれがスーパークラスの使用のためだと思います。このリンクのメソッドを使用することをお勧めします。https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods –