Не изменяется переменная внутри класса сеттером, выдаётся первоначальное значение. Как исправить?

Рейтинг: 0Ответов: 1Опубликовано: 30.05.2023
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)

Ответы

▲ 2Принят
    @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