无法更新python类中的属性

时间:2018-10-20 19:06:03

标签: python class object

这是我所做的事情的一部分:

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()

fire方法中的self.loader属性未按我的要求进行更新。它不会执行加载程序触发的操作,而是执行加载程序操作。我想减去发射值的加载程序,但它不是我想要的。每当我调用fire()时,它将显示一个递增的值

1 个答案:

答案 0 :(得分:0)

错误位于“设置者”:

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

在此将val添加到self._loader中,假设您将其设置为self.loader = val。因此,如果您写:

self.loader = self.loader-fired

self.loader为例,例如100,并发射3,然后self.loader-fired97,并通过设置 {{ 1}},您将在self.loader值中添加97

二传手通常具有以下形状:

self_loader

因此您的代码应如下所示:

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

此处的一个潜在问题是,如果您继续调用class Something(object): def __init__(self): self._loader = 100 def _get_loader(self): return self._loader def _set_loader(self, val): 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)),最终.fire()将获得一个低于 的值。因此,您可能想在此处使用_loader来防止这种情况:

max(0, ...)

如果您打电话给def _set_loader(self, val): self._loader = max(0, val)并且子弹数为零,您可能还想提出一个错误,因为我认为没有子弹就无法射击。