Попробуйте запустить следующий код:
class K:
pass
obj = K()
print(obj)
Вывод:
<__main__.K object at 0x01481FE8>
По умолчанию, если вы не пишете метод "в строку" (или __str__()
) мусор выше - это то, что python будет выдавать в виде строки. Обратите внимание, что функция print
может печатать только строки. Он не может печатать целые числа или что-то еще. Таким образом, print(n)
преобразует все входные данные в строки перед их печатью. Приведенный ниже код описывает, что делает встроенная функция print
:
import sys
def print(*args, sep=" ", end"\n", file=sys.stdout):
file.write(sep.join(map(str, args)) + end)
Итак, напишите свой собственный метод __str__
:
import sys
import io
class Node:
def __init__(self, data=None, pointer=None):
self.data = data
self.pointer = pointer
def print_node(self, *, sep="\t", file=sys.stdout):
print(
f"Node Data: {self.data}",
f"self: {id(self)}",
f"pointer: {id(self.pointer)}",
sep=sep,
file=file
)
def _set_pointer(self, pointer):
self.pointer = pointer
def _get_pointer(self):
return self.pointer
def __str__(self):
with io.StringIO() as string_stream:
self.print_node(file=string_stream)
stryng = string_stream.getvalue()
return stryng
Ваш метод узла печати изначально называлсяPrintNode
. Никогда не начинайте что-либо с заглавной буквы, если это не класс. Либо напишите printNode
или print_node
.
Во-вторых, я изменил f"pointer: {self.pointer}"
на f"pointer: {id(self.pointer)}"
Предположим, что вы этого не сделали. Ну, тогда print_node
напечатает self.pointer
. Но self.pointer
- это узел, поэтому он напечатает self.pointer.pointer
. Но self.pointer.pointer
- это узел, поэтому он напечатал бы self.pointer.pointer.pointer
и так далее ... Вы этого не хотите. Адрес памяти объекта может быть получен с помощью функции id()
.
Кроме того, для print_node
плохая идея напечатать себя. Это просто умолять о бесконечной рекурсии. Как мне распечатать self
? хорошо, я печатаю data
, self
и pointer
. Это означает, что я должен напечатать self
, что означает, что я должен напечатать self
, что означает, что я должен напечатать self
, и так далее, всегда и всегда.