练习:矩形类
创建一个Rectangle类:
- 属性:长度、宽度
- 方法:计算面积、计算周长、判断是否为正方形
- 使用属性验证确保长度和宽度为正数
理解题目要求
我们要创建一个Rectangle类,它需要:
1 属性:
- 长度
- 宽度
2 方法:
- 计算面积
- 计算周长
- 判断是否为正方形
3 特殊要求:
- 使用属性验证确保长度和宽度为正数
基础概念解释
什么是属性验证?
属性验证确保赋予属性的值是合理的。列如矩形的长度和宽度不能是负数或零。
代码实现步骤
方法一:使用属性验证(推荐)
class Rectangle:
def __init__(self, length, width):
self._length = None # 先初始化为None
self._width = None # 先初始化为None
self.length = length # 通过setter方法设置,会进行验证
self.width = width # 通过setter方法设置,会进行验证
@property
def length(self):
"""获取长度"""
return self._length
@length.setter
def length(self, value):
"""设置长度,并进行验证"""
if value <= 0:
raise ValueError("长度必须为正数")
self._length = value
@property
def width(self):
"""获取宽度"""
return self._width
@width.setter
def width(self, value):
"""设置宽度,并进行验证"""
if value <= 0:
raise ValueError("宽度必须为正数")
self._width = value
方法二:使用简单的验证(适合新手)
如果你对属性装饰器还不熟悉,可以先使用这种方法:
class Rectangle:
def __init__(self, length, width):
# 在构造方法中直接验证
if length <= 0 or width <= 0:
raise ValueError("长度和宽度必须为正数")
self.length = length
self.width = width
完整代码实现
让我们使用属性验证的方法来完成完整代码:
class Rectangle:
def __init__(self, length, width):
self._length = None
self._width = None
self.length = length # 这会调用length的setter方法
self.width = width # 这会调用width的setter方法
# 长度的getter和setter
@property
def length(self):
return self._length
@length.setter
def length(self, value):
if value <= 0:
raise ValueError("长度必须为正数")
self._length = value
# 宽度的getter和setter
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if value <= 0:
raise ValueError("宽度必须为正数")
self._width = value
def calculate_area(self):
"""计算面积"""
return self.length * self.width
def calculate_perimeter(self):
"""计算周长"""
return 2 * (self.length + self.width)
def is_square(self):
"""判断是否为正方形"""
return self.length == self.width
def __str__(self):
"""返回矩形的字符串表明"""
shape = "正方形" if self.is_square() else "矩形"
return f"{shape}:长度={self.length}, 宽度={self.width}, 面积={self.calculate_area()}, 周长={self.calculate_perimeter()}"
代码详细解释
属性验证部分
@property
def length(self):
return self._length
@length.setter
def length(self, value):
if value <= 0:
raise ValueError("长度必须为正数")
self._length = value
解释:
- @property:将方法变成属性,可以像访问属性一样调用
- @length.setter:定义设置属性时的行为
- 当给length赋值时,会自动调用setter方法进行验证
计算方法
def calculate_area(self):
return self.length * self.width
def calculate_perimeter(self):
return 2 * (self.length + self.width)
公式:
- 面积 = 长度 × 宽度
- 周长 = 2 × (长度 + 宽度)
判断正方形
def is_square(self):
return self.length == self.width
逻辑: 如果长度等于宽度,就是正方形
使用示例和测试
# 测试正常情况
try:
rect1 = Rectangle(5, 3)
print(rect1)
print(f"面积: {rect1.calculate_area()}")
print(f"周长: {rect1.calculate_perimeter()}")
print(f"是正方形吗: {rect1.is_square()}")
print()
# 测试正方形
square = Rectangle(4, 4)
print(square)
print(f"是正方形吗: {square.is_square()}")
print()
except ValueError as e:
print(f"错误: {e}")
# 测试异常情况
try:
invalid_rect = Rectangle(-2, 5) # 长度为负数
except ValueError as e:
print(f"错误: {e}") # 输出:错误: 长度必须为正数
try:
invalid_rect = Rectangle(0, 5) # 长度为零
except ValueError as e:
print(f"错误: {e}") # 输出:错误: 长度必须为正数
更简单的版本(适合完全新手)
如果你觉得属性装饰器太难理解,可以先从这个版本开始:
class SimpleRectangle:
def __init__(self, length, width):
# 简单验证
if length <= 0 or width <= 0:
raise ValueError("长度和宽度必须为正数")
self.length = length
self.width = width
def calculate_area(self):
return self.length * self.width
def calculate_perimeter(self):
return 2 * (self.length + self.width)
def is_square(self):
return self.length == self.width
def __str__(self):
shape = "正方形" if self.is_square() else "矩形"
return f"{shape}(长{self.length}, 宽{self.width})"
# 使用示例
rect = SimpleRectangle(5, 3)
print(rect) # 输出:矩形(长5, 宽3)
print(f"面积: {rect.calculate_area()}") # 输出:面积: 15
学习要点总结
- 属性验证:确保数据的合理性
- @property装饰器:将方法变成属性访问
- setter方法:在设置属性值时执行验证逻辑
- 几何计算:面积和周长的计算公式
- 条件判断:使用==判断是否相等
- 异常处理:使用try-except处理可能的错误
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
