Ошибка при наследовании функции с декоратором Python
У меня есть три класса с одинаковыми параметрами id. Я хочу, чтобы они наследовались от одного базового класса и наследовали функции (getter-setter), обернутые в декораторы @property и @id.setter (встроенные в Python). То есть наследовали то поведение, которое должно воспроизводиться при чтении-записи переменной.
Пример базового класса:
class A:
def __init__(self, id: int):
self.id = id
@property
def id(self) -> int:
return self.id
@id.setter
def id(self, val: int):
self.__id = val
Пример дочернего класса:
class B(A):
def do_something(self):
print("Hello")
Пример main.py:
b_obj = B(123)
print(b_obj.id)
На выходе я получаю ошибку переполнения стека рекурсии:
File "main.py", line 15, in id
return self.id
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
В чем заключается проблема и как можно решить поставленную задачу?
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
В этом месте возникает рекурсия, так как идет обращение к этому же property:
@property
def id(self) -> int:
return self.id # тут произойдет вызов этой же функции
Исправьте, чтоб обращаться к приватному полю объекта:
@property
def id(self) -> int:
return self.__id