Как избавиться от рекурсии в магическом методе абстрактного класса?
На сколько я понимаю в абстрактном классе можно хранить какое-то общее поведение для дочерних классов.
Подскажите, пожалуйста, как определить магический метод __str__ в абстрактном классе, чтобы при печати экземпляров дочерних классов выводилась строчка: данный метод сейчас вызывается в экземпляре (имя экземпляра) У меня сейчас получается ошибка рекурсии, на сколько я понимаю, из-за того, что при печати {self} он как раз не находя метода ищет его Base, находит и так далее...,
from abc import ABC
class Base(ABC):
def __str__(self):
return f' Данный метод сейчас вызывается в экземпляре {self}'
class A(Base):
pass
class B(Base):
pass
a, b = A(), B()
print(a, b)
Ответы (2 шт):
Ошибка рекурсии у вас выходит потому, что в этом фрагменте кода:
def __str__(self):
return f' Данный метод сейчас вызывается в экземпляре {self}'
^^^^^^
для печати {self} питон получает строковое представление объекта self, для чего он опять вызывает __str__(self) и так по кругу.
Кроме того, экземпляры объектов в Python не имеют имён, хотя вы можете сами задать объекту имя при создании, запомнить его в __init__ и потом печатать его.
Пример кода, который работает без ошибки и выводит id объекта:
class Base(ABC):
def __str__(self):
return f' Данный метод сейчас вызывается в экземпляре {id(self)}'
Вывод (у вас будут другие цифры, конечно):
Данный метод сейчас вызывается в экземпляре 140550787401712 Данный метод сейчас вызывается в экземпляре 140550787401656
В дополнение к вышеизложенному. Нашёл как можно вывести имя экземпляра класса, используя globals()
см. Как вывести имя экземпляра класса?