2016-11-02 14 views
0
class stack: 
    def __init__(self): 
     self.st = [] 
    def push(self, x): 
     self.st.append(x) 
     return self 
    def pop(self): 
     return self.st.pop() 

Может кто-нибудь сказать мне, почему я не могу запустить python и сделать stack.push (3) без получения несвязанной ошибки. Я делаю следующееПочему этот метод вызывает ошибку «Unbound method ... instance as first arg»?

>>> from balance import * 
>>> stack.push(3) 
Traceback (most recent call last):File "<stdin>", line 1, in <module> 
TypeError: unbound method push() must be called with stack instance as first argument (got int instance instead) 
>>> 

Но когда я пишу этот код я могу нажать на стек без ошибок:

import sys 

k = sys.argv[1] 

class stack: 
    def __init__(self): 
     self.st = [] 
    def push(self, x): 
     self.st.append(x) 
     return self 
    def pop(self): 
     return self.st.pop() 
    def isEmpty(self): #added an empty fucntion to stack class 
     return self.st == [] 

def balance(k): 
    braces = [ ('(',')'), ('[',']'), ('{','}') ] #list of braces to loop through 
    st = stack() #stack variable 

    for i in k: #as it iterates through input 
       #it checks against the braces list 
     for match in braces: 
      if i == match[0]: #if left brace put in stack 
       st.push(i) 
      elif i == match[1] and st.isEmpty(): #if right brace with no left 
       st.push(i)      #append for condition stateme$ 
      elif i == match[1] and not st.isEmpty() and st.pop() != match[0]: 
       st.push(i) #if there are items in stack pop 
         # for matches and push rest to stack 

if st.isEmpty(): #if empty stack then there are even braces 
    print("Yes") 
if not st.isEmpty(): #if items in stack it is unbalanced 
    print("No") 


balance(k) #run balance function 
+0

Всегда указывайте ** класс ** с помощью MixedCase и ** экземпляр ** с строчными буквами, например, idjaw и PEP-8. Тогда вы не можете путать класс с экземпляром, как вы здесь делаете. – smci

ответ

5

ошибка говорит вам точную проблему:

...method push() must be called with stack instance... 

You делают это:

stack.push(3) 

Который не экземпляр стека. Вы пытаетесь вызвать метод экземпляра как метод класса, потому что вы не создали экземпляр stack. Например:

>>> st = stack() 
>>> st.push(3) 

Вы действительно сделали это правильно в вашей функции баланса:

st = stack() #stack variable 

Теперь вы на самом деле есть экземпляр stack. Вы также четко его использовать дальше в коде здесь, например:

st.push(i) 

Кроме того, вы не должны называть stack переменной, это класс.

Вы также должны обратиться к PEP8 style guide, чтобы придерживаться соответствующих соглашений. Например, классы должны быть прописными: stack должен быть Stack

+0

Спасибо. Наш профессор никогда не говорил, что создание переменной для класса или функции создавало что-либо. Хотя это было –

+0

Думал, что это было так, как люди. Спасибо, что разъяснил все это. –