无法在python类中更新属性

2024-09-24 22:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我所做的一部分:

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没有按我所希望的那样更新。它不是做loader-fired,而是做loader-something。我想用激发值减去loader,但它没有如我所愿。每次调用fire()时,它都显示一个递增的值


Tags: selfgetreturnobjectinitdefrandomproperty
1条回答
网友
1楼 · 发布于 2024-09-24 22:27:45

错误位于“setter”处:

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,并且通过设置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)

如果您调用.fire()并且子弹数为零,您可能还希望引发一个错误,因为我假设没有子弹就不能开火

相关问题 更多 >