Не изменяется переменная внутри класса сеттером, выдаётся первоначальное значение. Как исправить?
class User:
def __init__(self):
self.__health = 100
self.__damage = 10
@property
def health(self):
return self.__health
@property
def damage(self):
return self.__damage
@health.setter
def health1(self):
self.__health -= self.damage
test = User()
print(test.health1)
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
@health.setter
def health1(self):
self.__health -= self.damage
у сеттера имя должно совпадать с именем геттера, и должен быть второй параметр, через который придет новое значение при присваивании через test.health = new_health. Т.е. должно быть так:
@health.setter
def health(self, value):
self.__health = value
Сеттеры предназначены именно для установки нового значения, они вызываются при присваивании нового значения по их имени, а не просто при их "упоминании" (как у вас в коде print(test.health1)).
Если нужно выполнить действие, а не передать новое значение, то вам нужен просто обычный метод, а не проперти. Например, ниже в коде я добавил метод hit_myself, который уменьшает значение health на значение damage:
class User:
def __init__(self):
self.__health = 100
self.__damage = 10
@property
def health(self):
return self.__health
@health.setter
def health(self, value):
self.__health = value
@property
def damage(self):
return self.__damage
def hit_myself(self):
self.health -= self.damage
test = User()
print(test.health)
test.hit_myself()
print(test.health)
Вывод:
100
90