Ленивая инициализация параметров Python странный порядок выполнения

#python #oop #pytorch #pycharm

Вопрос:

TLDR — Код, который не должен выполняться, выполняется во время инициализации класса

У меня есть два класса, один базовый класс (который должен быть абстрактным) и один класс, который наследуется от него.

 import logging

import torch
from torch.utils.data import Dataset

logger = logging.getLogger(__name__)

class TsDataSetBase(Dataset):
    def __init__(self):
        self.__labels: torch.Tensor = None
        self.__data: torch.Tensor = None
    
    def __len__(self):
        return len(self.labels)
    
    def __getitem__(self, idx):
        return self.data[idx], self.labels[idx]
    
    def get_as_tensor(self):
        """
        load a single file as a tensor
        """
        raise RuntimeError("this is a base class")
    
    @property
    def labels(self) -> torch.Tensor:
        if self.__labels is None or self.__data is None:
            self.__labels, self.__data = self.get_as_tensor()
        return self.__labels
    
    @property
    def data(self) -> torch.Tensor:
        if self.__labels is None or self.__data is None:
            self.__labels, self.__data = self.get_as_tensor()
        return self.__data
    
    @property
    def tensors(self):
        """
        This is here to fit the TensorDataset object
        """
        return self.data, self.labels
 

Это Сын:

 import logging

from data_loaders.TsDataSetBase import TsDataSetBase

logger = logging.getLogger(__name__)


class UcrDataSet(TsDataSetBase):

  def __init__(self, path_to_ds):
    super().__init__()
    self.path_to_ds = path_to_ds
    print("so strange")
    self._train = 123
    print("end of init")

  def get_as_tensor(self):
    filepath = self.path_to_ds
    print("strange")
    logger.info(f"converting csv file to tensor {filepath}")
    return None, None


def build_new_ds(path_to_ds: str) -> TsDataSetBase:
   return UcrDataSet(path_to_ds)
 

Теперь, когда я выполняю следующую строку:

 ds = build_new_ds(dataset_to_test)
 

Я получаю этот чрезвычайно странный вывод:

 Connected to pydev debugger (build 202.7660.27)
so strange
strange
strange
strange
strange
 

Когда я пытаюсь использовать точку останова, она не останавливается, я использую Pycharm.
Это действительно заставляет меня задуматься о том, что именно происходит, это проблема с моим окружением или что-то еще?

Большое спасибо

Комментарии:

1. «Код, который не должен выполняться, выполняется во время инициализации класса» Что выполняется, что точно не должно выполняться?

2. метод get_as_tensor вызывается, и его не следует вызывать

3. Это невозможно воспроизвести, по крайней мере, с моей стороны, я получаю 'so strange' и. 'end of init' Как вы выполняете свой код?