Python类属性定义问题:Shelf类withdraw校验未触发
问题分析与修复
你的代码核心问题出在size属性的setter方法里——你校验的是当前已有的size值(通过self.size调用getter获取),而不是要设置的新size参数。
比如执行shelf.withdraw(14)时,原本self.size是12,计算出12-14=-2后调用setter,但setter里的if self.size <0判断的还是修改前的12,自然不会触发错误,最后直接把_size设成了-2。
修复后的代码
class Shelf: def __init__(self, capacity=12): self.capacity = capacity self._size = 0 def __str__(self): return("📕" * self.size) def deposit(self, n): self.size = n + self.size def withdraw(self, n): self.size = self.size - n print(self.size) @property def capacity(self): return self._capacity @capacity.setter def capacity(self, capacity): if capacity < 0: raise ValueError("None Positive Capacity") self._capacity = capacity @property def size(self): return self._size @size.setter def size(self, size): # 校验传入的新size参数,而非旧的self.size值 if size < 0: raise ValueError("Insufficient books") if size > self.capacity: raise ValueError("OverCapacity") self._size = size def main(): shelf=Shelf() shelf.deposit(12) shelf.withdraw(14) print(shelf) if __name__ == "__main__": main()
关键修改点
- 将
sizesetter中的self.size全部替换为传入的size参数:- 原错误逻辑:判断修改前的旧值,无法拦截非法的新值
- 修复后逻辑:直接校验要设置的新值,确保修改符合规则
修改后执行代码,会触发预期的ValueError: Insufficient books,符合你的校验需求。
内容的提问来源于stack exchange,提问作者Alireza Taheri
相关产品推荐
相关产品推荐

