2016-11-01 5 views
-1

У меня есть два класса в двух разных файлах. Я пытаюсь вызвать add_last (из SinglyLinkedListClass) из моего класса ArrayQueue и в конечном итоге с объектом ArrayQueue не имеет атрибута '_tail'. Заранее спасибо!Объект класса не имеет атрибута Python

#-------------------------------------------------------------------- 
class EmptyList (Exception) : 
    pass 
# ------------------------------------------------------------------- 

class SinglyLinkedList : 

    # ------------------------------------------------ # 
    class _Node :          # 
     def __init__ (self, theElement, theNext) : # 
      """Initializes newly created _Node"""  # 
      self._element = theElement     # 
      self._next = theNext     # 
    # ------------------------------------------------ # 


    def __init__ (self) : 
     """Initializes newly created SinglyLinkedList""" 
     self._head = None 
     self._tail = None 
     self._size = 0 
     self._lastNode = None 

    def __len__ (self) : 
     return self._size 

    def __str__ (self) : 
     """Returns string representation of SinglyLinkedList""" 
     returnString = 'Head --> ' 
     current = self._head 
     while current != None : 
      returnString += (str(current._element) + ' ') 
      current = current._next 
     returnString += ('<-- Tail (' 
      + ('Empty' if self._size == 0 else 'Not Empty') 
      + (' with ' + str(self._size) + ' elements)')) 
     return returnString 

    def __len__ (self) : 
     """Returns length of SinglyLinkedList""" 
     return self._size 

    def is_empty (self) : 
     """Returns True if SinglyLinkedList is empty""" 
     return self._size == 0 

    def first (self) : 
     """Returns element at head of SinglyLinkedList""" 
     if self._size == 0 : 
      raise EmptyList 
     return self._head._element 

    def last (self) : 
     """Returns element at tail of SinglyLinkedList""" 
     return self._tail._element 

    def add_first (self, newElement) : 
     """Inserts one element at head of SinglyLinkedL""" 
     theNewNode = self._Node (newElement, self._head) 
     self._head = theNewNode 
     if self._tail is None : 
      self._tail = theNewNode 
     self._size += 1 

    def delete_first (self) : #deque 
     """Deletes one element from head of SinglyLinkedList""" 
     if self._head is None : 
      raise EmptyList('Error: attempt delete_first on empty list!') 
     deletedElement = self._head._element 
     self._head = self._head._next 
     if self._head is None : 
      self._tail = None 
     self._size -= 1 
     return deletedElement 

    def add_last (self, newElement) : #enque 
     """Inserts one element at tail of SinglyLinkedList""" 
     theNewNode = self._Node (newElement, None) 
     if self.is_empty() : 
      self._head = theNewNode 
      self._tail = theNewNode 
     else: 
      self._tail._next = theNewNode 
      self._tail = theNewNode 
     self._size += 1 
# ------------------------------------------------------------------- 
class ArrayQueue (SinglyLinkedList): 


    def __str__ (self) : 
     returnString = 'Size is ' + str(self._size) + ' Front - > ' 
     for i in range (self._front, self._front + self._size) : 
      j = i % len(self._data) 
      returnString += (str(self._data[j]) + ' ') 
     return (returnString + ' <- Back') 


    def __len__ (self) : 
     return self._size 

    def __init__ (self) : 
     self._data = SinglyLinkedList() 
     self._size = 0 
     self._front = 0 

    def enqueue (self, e) : 
     self._size += 1 
     return SinglyLinkedList.add_last(self, e) 

    def dequeue (self) : 
     if self.is_empty() : 
      raise Empty('Queue is empty!') 
     self._size -= 1 
     return SinglyLinkedList.delete_first() 

    def first (self) : 
     if self.is_empty() : 
      raise Empty('Queue is empty!') 
     return SinglyLinkedList.first() 

    def is_empty (self) : 
     return self._size == 0 

if __name__ == '__main__' : 
    mylist = ArrayQueue() 
    choice = 0 
    element = None 
    while choice < 4 : 
     print ('1. enque') 
     print ('2. dequeue') 
     print ('3. first') 
     print ('4. is_empty') 
     choice = int(input('Enter Choice : ')) 
     if choice == 1 : 
      element = int(input('Enter integer to add : ')) 
      mylist.enqueue(element) 
     elif choice == 2 : 
      try : 
       print ('Deleted', mylist.dequeue()) 
      except Empty as el : 
       print (el) 

     elif choice == 3 : 
      print(mylist.first()) 

     elif choice == 4 : 
      mylist._size == 0 

     print(mylist) 
+0

Почему '_tail'? почему '_'? кажется настолько ненужным – MooingRawr

+0

Почему вы пытаетесь реализовать свой собственный односвязный список в первую очередь ....? –

+0

Класс singlylinkedlist имеет внутри себя класс, называемый узлом. _tail ссылается на конец связанного списка. Его проект для школы, я собираюсь использовать очереди в виде односвязных списков для чтения и выполнения математических операций из файла, указанного пользователем. Я не могу понять, почему я не могу наследовать метод add_last из односвязного списка в мой метод enqueue для arrayQueue. –

ответ

0

ArrayQueue не имеет хвоста, потому что вы не выполните инициализации родительского класса;

class ArrayQueue (SinglyLinkedList): 

def __init__ (self) : 
    super(ArrayQueue , self).__init__() # call parent's init 
    self._size = 0 
    self._front = 0 
+0

Спасибо за ваш ответ! –

0

ArrayQueue определяет свой собственный __init__() метод, поэтому унаследовал __init__() от SinglyLinkedList (который где _tail определен) никогда не вызывается.

+0

Спасибо вам за ваш ответ! –