2017-05-24 8 views
0

には属性「プッシュ」を持っていない:DPythonの「strの」オブジェクトは、うまくいけば私のコードがあまりにもばかばかしいではありません、私は絶対のPythonで初心者、まだコーディングで、一般的に非常に良好ではないよPyCharm

Iスタックプログラムを記述する必要があります。スタックプログラムはスタックプログラム&のリストです。 これは私のコードです:

class Stack: 
    def __init__(self): 
     self.items = [] 

    def pop(self): 
     return self.items.pop() 

    def push(self, item): 
     self.items.append(item) 

    def isEmpty(self): 
     return self.items == [] 

def execute(list): 
    result = Stack() 
    for x in list: 
     if 'LOAD' in x: 
      number = substring_after(x, " ") 
      result.push(number) 
     elif 'ADD' in x: 
      result = result.pop() + result.pop() 
     elif 'MUL' in x: 
      result = result.pop() * result.pop() 
     elif 'SUB' in x: 
      first = result.pop() 
      result = result.pop() - first 
     elif 'DIV' in x: 
      first = result.pop() 
      result = result.pop()/first 
     elif 'PRINT' in x: 
      print(result.pop()) 
      if result.isEmpty(): 
       print('Execution completed') 
      else: 
       print('There are still values in the Stack') 
     else: 
      print('Not a valid statement for Stack Program') 

def substring_after(s, delim): 
    return s.partition(delim)[2] 

def main(): 
    operation1 = ["LOAD 2", "LOAD 3", "ADD", "LOAD 4", "MUL", "PRINT"] 
    operation2 = ["LOAD 4", "LOAD 5", "ADD", "LOAD 2", "LOAD 3", "ADD", 
    "MUL", "PRINT"] 
    operation3 = ["LOAD 6", "LOAD 7", "LOAD 4", "SUB", "DIV", "LOAD 5", 
    "MUL", "PRINT"] 

    execute(operation1) 

if __name__ == '__main__': 
    main() 

私は取得していますエラーは次のとおりです。

Traceback (most recent call last): 
    File "XXX/EA2-Stack.py", line 53, in <module> main() 
    File "XXX/EA2-Stack.py", line 47, in main execute(operation1) 
    File "XXX/EA2-Stack.py", line 19, in execute result.push(number) 
AttributeError: 'str' object has no attribute 'push' 

私は理解していない:

1)を、なぜそれがそこにあることを、言わないん'押す'?私は「プッシュ」と呼ばれる方法を定義しました。 は、私はまた、書き込もうとしました: プッシュ(結果、数)、しかし、それは「未解決の参照」

2)なぜそれが属性プッシュ言うんは言いますか?これは属性ではなく、メソッドです。

私はここで何かが欠けてること、感じを持っている:(私を助けていないため ありがとう:。>

答えて

2
result = Stack() 
result.push(number) 

問題ありませんが、ここを

result = result.pop() + result.pop() 
result.push(number) 

今問題があります! resultStackの代わりにstr(エラーメッセージが示すように)になりました。実際にはstrには必要な属性がありません。別の変数名を使用してください。result.pushはattrib ute、それはまた方法であるが。

+0

おかげでたくさん!私はこれを考えなかったし、今それは動作します:) – Lorayne

0

なぜ「プッシュ」がないと言われますか?

Stackインスタンスでは呼び出さないためです。最初のコマンドを実行した後、resultはスタックインスタンスを指しません。

属性プッシュとはどういう意味ですか?これは属性ではなく、メソッドです。

Pythonインタプリタはまだ気にしません。最初に、この名前の属性が存在するかどうかをチェックします。その後、それを呼び出そうとします。 Python関数(したがってメソッド)はファーストクラスの市民であり、特別なものはありません。

0

あなたは、それによってあなたのスタックオブジェクトを破壊し、Stackオブジェクトから値へのあなたの結果変数を再割り当てされています

result = result.pop() + result.pop() 

これは、スタック(のインスタンスを破棄)

関連する問題