
在面向对象编程中,设计一个模拟容器(如饼干罐jar)的类是常见的练习。此类通常包含初始化容量、存入饼干(deposit)和取出饼干(withdraw)等核心功能。然而,在实现这些功能时,尤其是在处理边界条件和异常情况时,稍有不慎便可能导致逻辑错误。
一个典型的Jar类应具备以下属性和方法:
原始的withdraw方法实现如下:
class Jar:
# ... 其他方法和属性 ...
def withdraw(self, n):
# 原始的条件判断
if n <= self.capacity and n < self.size:
self._size -= n
else:
raise ValueError
# ... 其他方法和属性 ...这个withdraw方法中的条件判断 if n <= self.capacity and n < self.size: 存在两个主要问题:
n <= self.capacity 的冗余性与误导性:在withdraw操作中,n代表要取出的饼干数量,而不是取完后的总数。通常,取出数量n与饼干罐的总容量self.capacity之间没有直接的逻辑关联。这个条件更适用于deposit方法,用于判断存入数量是否合理。对于withdraw,我们主要关心的是n是否为正数,以及n是否小于或等于当前存储量self.size。
立即学习“Python免费学习笔记(深入)”;
n < self.size 的边界条件错误:这是导致check50测试失败的核心原因。当饼干罐中恰好有k个饼干,并且我们尝试取出k个饼干时,n(即k)将等于self.size(即k)。此时,条件n < self.size(即k < k)为假,导致ValueError被抛出,而不是成功取出所有饼干。check50通常会测试这种边缘情况,例如尝试清空饼干罐。
要解决上述问题,我们需要将withdraw方法的条件判断修正为:
因此,n <= self.size 是正确的条件。结合n必须大于0的隐性或显性要求,最严谨的判断应为 if n > 0 and n <= self._size:。
以下是修正后的Jar类完整代码:
class Jar:
def __init__(self, capacity=12):
# 确保容量为正数
if not isinstance(capacity, int) or capacity <= 0:
raise ValueError("容量必须是正整数")
self._capacity = capacity
self._size = 0
def __str__(self):
# 使用'?'符号表示饼干数量
return f"{self.size * '?'}"
def deposit(self, n):
# 存入前检查n的有效性及是否会超出容量
if not isinstance(n, int) or n <= 0:
raise ValueError("存入数量必须是正整数")
if self._size + n > self._capacity:
raise ValueError("存入后将超出容量")
self._size += n
def withdraw(self, n):
# 提取前检查n的有效性及是否会超出当前存储量
if not isinstance(n, int) or n <= 0:
raise ValueError("提取数量必须是正整数")
# 关键修正:n必须小于或等于当前存储量
if n > self._size: # 或者写成 if n <= self._size: self._size -= n else: raise ValueError
raise ValueError("提取数量超出当前存储量")
self._size -= n
@property
def capacity(self):
# 容量属性
return self._capacity
@property
def size(self):
# 当前存储量属性
return self._size
代码解析:
本教程通过分析Jar类withdraw方法在CS50P check50测试中遇到的问题,指出了原始条件判断的逻辑缺陷,并提供了修正后的代码。核心在于将withdraw方法中不准确的条件n < self.size修正为允许n <= self.size,并移除了不必要的n <= self.capacity判断。这不仅解决了特定的测试错误,也提升了代码的健壮性和逻辑清晰度,强调了在编写类方法时进行全面边界条件测试的重要性。
以上就是Python Jar 类 withdraw 方法逻辑修正教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号