You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改点

  • 将size setter中的self.size全部替换为传入的size参数:
    • 原错误逻辑:判断修改前的旧值,无法拦截非法的新值
    • 修复后逻辑:直接校验要设置的新值,确保修改符合规则

修改后执行代码,会触发预期的ValueError: Insufficient books,符合你的校验需求。

内容的提问来源于stack exchange,提问作者Alireza Taheri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:15:27