python训练营Day 13 练习任务:面向对象编程入门 -练习任务

内容分享2小时前发布
0 0 0

练习:矩形类
创建一个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

学习要点总结

  1. 属性验证:确保数据的合理性
  2. @property装饰器:将方法变成属性访问
  3. setter方法:在设置属性值时执行验证逻辑
  4. 几何计算:面积和周长的计算公式
  5. 条件判断:使用==判断是否相等
  6. 异常处理:使用try-except处理可能的错误
© 版权声明

相关文章

暂无评论

none
暂无评论...