Не удается обновить атрибут в классах Python - PullRequest
0 голосов
/ 20 октября 2018

Вот часть того, что я сделал:

class Something(object):
    def __init__(self):
        self._loader = 100

    def _get_loader(self):
        return self._loader

    def _set_loader(self, val):
        self._loader = self._loader+val

    loader = property(_get_loader, _set_loader)

    def fire(self):
        fired = random.randint(1, 21)
        self.loader = self.loader-fired
        print("Bullets remaining : {}".format(self.loader))

M = Something()
M.fire()

Атрибут self.loader в методе fire не обновляется так, как я хочу.Вместо того, чтобы делать загрузчик, он делает загрузчик-то.Я хочу, чтобы минус загрузчик по сработавшей стоимости, но это не так, как я хочу.Отображается увеличивающееся значение каждый раз, когда я вызываю fire ()

1 Ответ

0 голосов
/ 20 октября 2018

Ошибка находится в «сеттере»:

def _set_loader(self, val):
    self._loader = <s>self._loader +</s> val

Вот вам это добавление val к self._loader, если вы установите его как self.loader = val,Поэтому, если вы напишите:

self.loader = self.loader-fired

с self.loader, например, 100, и сработало 3, тогда self.loader-fired будет 97, а установит self.loader, таким образом, вы добавите 97 к значению self_loader.

Сеттер обычно имеет форму:

def _set_loader(self, val):
    self._loader = <b>val</b>

Таким образом, ваш код должен выглядеть следующим образом:

class Something(object):
    def __init__(self):
        self._loader = 100

    def _get_loader(self):
        return self._loader

    def _set_loader(self, val):
        self._loader = <b>val</b>

    loader = property(_get_loader, _set_loader)

    def fire(self):
        fired = random.randint(1, 21)
        self.loader = self.loader-fired
        print("Bullets remaining : {}".format(self.loader))

Потенциальная проблема заключается в том, что если вы продолжите вызывать .fire(), в конечном итоге _loader получит значение ниже ноль.Таким образом, вы можете использовать max(0, ...) здесь, чтобы предотвратить это:

def _set_loader(self, val):
    self._loader = <b>max(0,</b> val<b>)</b>

Вы также можете вызвать ошибку в случае, если вы звоните .fire(), а количество пуль равняется нулю, так как я предполагаю, чтонельзя стрелять без пуль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...