Задать вопрос
Asics6789
@Asics6789
Студент 2 курса ФКН ВГУ, основной язык Java

Почему self интерпретируется как None в ходе инициализации __init__?

Код:
from typing import Optional


class TreeNode:
    def __init__(self, depth: int):
        self.split_pair: Optional[SplitPair] = None
        self.left: Optional[TreeNode] = None
        self.right: Optional[TreeNode] = None
        self.predict: float = 0.0
        self.is_leaf: bool = False  # Та самая строка
        self.depth: int = depth

    def __str__(self):
        if self.is_leaf:
            return f"leaf = {self.predict:.3f}"
        return str(self.split_pair)


class SplitPair:
    def __init__(self, col_name: str, split_value: float):
        self.col_name: str = col_name
        self.split_value: float = split_value

    def __str__(self):
        return f"{self.col_name} > {self.split_value}"

node = TreeNode(1)  # Дебаг запускаю тут
print(node)


Описан буквально весь код, что имеется в проекте, по какой-то причине при запуске дебага на вышеуказанной точке просходит следующее:
  1. Дебаг движется про строкам __init__
  2. В течение движения self ведёт себя как положено, IDE отображает его значение как ссылку в памяти
  3. После выполнения "той самой строки" немедленно self получает None


679ca26a78b8e454212680.png
679ca27a5cdd1604025429.png
  • Вопрос задан
  • 77 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
def __init__(self, depth: int):
    self.split_pair: Optional[SplitPair] = None
…
def __str__(self):
    return str(self.split_pair)

Полагаю, причина тут. self получает «строковое представление» “None”
Ответ написан
Комментировать
Lord_of_Rings
@Lord_of_Rings Куратор тега Python
Дунадан - северный странник. Злой, но очень добрый
Это артефакт отладки, с самим объектом ничего не происходит. Строка "None" появляется в выводе, но это не означает, что сам объект становится None
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Maksim_64
@Maksim_64
Data Analyst
Не очень понятно, у тебя есть описание метода __str__, строковое представление объекта, в котором ты описал его логику (в зависимости от значения атрибутов объекта), затем, ты вызываешь print, который автоматически вызывает __str__ и там происходит ровно то что ты описал, то есть print(экземпляр класса) выведет ровно то, что возвращает __str__, если он был определен, если нет то стандартно ссылку в памяти на объект экземпляра.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
31 янв. 2025, в 15:37
3000 руб./за проект
31 янв. 2025, в 14:37
200000 руб./за проект
31 янв. 2025, в 14:06
5000 руб./за проект