#python #types #linked-list #duck-typing
#python #типы #связанный список #ввод с уткой
Вопрос:
У меня есть следующий код, который позволяет мне нажимать (помещать известный тип в стек), всплывать (удалять последнее добавленное значение из стека) и выполнять итерации по стеку.
Код:
class Node:
def __init__(self):
self.__value = 0
self.__NEXT = None
@property
def value(self):
return self.__value
@value.setter
def value(self, x):
self.__value = x
@property
def NEXT(self):
return self.__NEXT
@NEXT.setter
def NEXT(self, x):
if type(x) is Node:
self.__NEXT = x
else:
raise TypeError("Invalid DataType provided for NEXT Pointer, needs to be of type Node")
def __str__(self):
return "{}".format(self.__value)
class Stack:
def __init__ (self):
self.__START = None
self.__END = None
@property
def START(self):
return self.__START
@property
def END(self):
return self.__END
def PUSH(self, node):
print(node)
if type(node) is not Node:
raise TypeError("Invalid DataType provided for NEXT Pointer, needs to be of type Node")
if self.__START is None:
self.__START = node
self.__END = node
return
node.NEXT = self.__START
self.__START = node
#setting the top of the stack as self.__START
def POP(self):
if self.__START == None:
raise ValueError("There are no nodes in the Linked List")
self.__START = self.__START.NEXT
print("POP completed")
#setting the second to the top as the top
def __iter__(self):
self.__ITERATOR = self.__START
return self
def __next__(self):
if self.__ITERATOR != None:
node = self.__ITERATOR
self.__ITERATOR = self.__ITERATOR.NEXT
return node
else:
raise StopIteration
myStack = Stack()
node1 = Node()
node1.value = 1
node2 = Node()
node2.value = 2
node3 = Node()
node3.value = 3
node4 = Node()
node4.value = 4
myStack.PUSH(node1)
myStack.PUSH(node2)
myStack.POP()
myStack.PUSH(node3)
myStack.PUSH(node4)
myStack.POP()
for node in myStack:
print(node)
Вывод таков:
1
2
POP завершен
3
4
POP завершен
3
1
Этот код работает, если записи имеют тип Node. Я хочу повторить это, но записи могут быть любого типа данных (общий тип), а не только узла (nodes). Проблема, с которой я продолжаю сталкиваться, заключается в том, что объект ‘int’ не имеет атрибута ‘NEXT’.
Ответ №1:
Ну, для начала я бы порекомендовал вам иметь конструктор для класса ‘Node’, подобный следующему:
class Node:
def __init__(self, value=0, next=None):
self.__value = value
self.__NEXT = next
Затем вы должны иметь в виду, что в классе ‘Stack’ вы используете интерфейс класса ‘Node’ с:
node.NEXT = self.__START
Итак, все узлы, которые вы помещаете в стек, должны либо быть экземпляром класса ‘Node’, либо принадлежать классу, который наследуется от класса ‘Node’.
Что касается наследования, проверьте следующую документацию.
Комментарии:
1. Любой вариант шаблона или общий тип для решения его проблемы?