Day 29: 复习
Day 28复习:Python类的定义和方法
📚 复习总结
1. 类的定义 - 核心概念回顾
🔑 关键点:
- 类是创建对象的模板/蓝图
- 使用
class
关键字定义 - 类名采用 PascalCase 命名方式(首字母大写)
# 基础语法
class MyClass:pass # 占位符,保证语法完整
💡 理解要点:
类就像是工厂的生产模具,对象就是根据模具生产出的具体产品。一个类可以创建无数个对象实例。
2. __init__
初始化方法 - 构造函数
🔑 关键点:
- 创建对象时自动调用
- 第一个参数必须是
self
- 用于设置对象的初始状态
class Person:def __init__(self, name, age):self.name = name # 实例属性self.age = age # 实例属性print(f"创建了{name},年龄{age}岁")# 创建对象时自动执行__init__
person = Person("小明", 18)
⚠️ 注意事项:
self
代表当前实例,不需要手动传递- 实例属性通过
self.属性名
定义 - 可以在
__init__
中进行参数验证和初始化操作
3. 类的普通方法 - 实例行为
🔑 关键点:
- 第一个参数必须是
self
- 通过对象调用:
对象.方法名()
- 可以访问和修改实例属性
class Student:def __init__(self, name, score):self.name = nameself.score = scoredef introduce(self):return f"我是{self.name},成绩{self.score}分"def add_score(self, points):self.score += pointsreturn self.score
4. 类的继承 - 代码复用机制
🔑 关键点:
- 子类继承父类的所有属性和方法
- 使用
super()
调用父类方法 - 可以重写(override)父类方法
class Animal:def __init__(self, name):self.name = namedef eat(self):return f"{self.name}在吃东西"class Dog(Animal): # 继承Animaldef __init__(self, name, breed):super().__init__(name) # 调用父类__init__self.breed = breeddef eat(self): # 方法重写return f"{self.name}正在吃狗粮"
📝 继承的优势:
- 代码复用,减少重复
- 建立类之间的层次关系
- 支持多态性
🏆 作业复习与解析
题目1:圆类设计 - 基础类实现
复习重点:
- 数学公式的应用:面积 = πr²,周长 = 2πr
math
模块的使用- 方法返回值的处理
import mathclass Circle:def __init__(self, radius=1):self.radius = radiusdef calculate_area(self):area = math.pi * self.radius ** 2return round(area, 2) # 保留两位小数def calculate_circumference(self):circumference = 2 * math.pi * self.radiusreturn round(circumference, 2)# 测试
circle = Circle(5)
print(f"半径:{circle.radius}")
print(f"面积:{circle.calculate_area()}")
print(f"周长:{circle.calculate_circumference()}")
🎯 学习要点:
- 默认参数的使用 (
radius=1
) - 数值精度控制 (
round()
函数) - 类方法的命名规范
题目2:长方形类设计 - 条件判断应用
复习重点:
- 多个属性的管理
- 布尔方法的实现
- 特殊情况的处理(正方形判断)
class Rectangle:def __init__(self, length=1, width=1):self.length = lengthself.width = widthdef calculate_area(self):return self.length * self.widthdef calculate_perimeter(self):return 2 * (self.length + self.width)def is_square(self):return self.length == self.width # 布尔返回值# 测试正方形判断
rect = Rectangle(4, 6)
square = Rectangle(5, 5)
print(f"长方形是正方形:{rect.is_square()}") # False
print(f"正方形是正方形:{square.is_square()}") # True
🎯 学习要点:
- 多参数构造函数
- 布尔方法的设计原则
- 边界条件的考虑
题目3:工厂模式 - 设计模式应用
复习重点:
- 工厂函数的设计思想
- 可变参数
*args
的应用 - 异常处理机制
def create_shape(shape_type, *args):"""图形工厂函数shape_type: "circle" 或 "rectangle"*args: 可变参数,根据图形类型传入不同数量的参数"""if shape_type == "circle":if len(args) == 0:return Circle() # 默认半径else:return Circle(args[0])elif shape_type == "rectangle":if len(args) == 0:return Rectangle() # 默认长宽elif len(args) == 1:return Rectangle(args[0], args[0]) # 正方形else:return Rectangle(args[0], args[1]) # 长方形else:raise ValueError(f"不支持的图形类型:{shape_type}")# 多种创建方式测试
shape1 = create_shape("circle", 5) # 指定半径的圆
shape2 = create_shape("rectangle", 3, 4) # 长方形
shape3 = create_shape("rectangle", 6) # 正方形
default_circle = create_shape("circle") # 默认圆
🎯 学习要点:
- 工厂模式的实际应用
- 可变参数的灵活处理
- 错误处理的重要性
📋 完整复习代码
import math# 圆类
class Circle:def __init__(self, radius=1):self.radius = radiusdef calculate_area(self):area = math.pi * self.radius ** 2return round(area, 2)def calculate_circumference(self):circumference = 2 * math.pi * self.radiusreturn round(circumference, 2)# 长方形类
class Rectangle:def __init__(self, length=1, width=1):self.length = lengthself.width = widthdef calculate_area(self):return self.length * self.widthdef calculate_perimeter(self):return 2 * (self.length + self.width)def is_square(self):return self.length == self.width# 工厂函数
def create_shape(shape_type, *args):if shape_type == "circle":if len(args) == 0:return Circle()else:return Circle(args[0])elif shape_type == "rectangle":if len(args) == 0:return Rectangle()elif len(args) == 1:return Rectangle(args[0], args[0])else:return Rectangle(args[0], args[1])else:raise ValueError(f"不支持的图形类型:{shape_type}")# 综合测试函数
def comprehensive_test():print("=== Python类定义和方法 - 复习测试 ===\n")# 1. 基础类测试print("📐 1. 圆类功能测试:")circle = Circle(5)print(f" 半径:{circle.radius}")print(f" 面积:{circle.calculate_area()}")print(f" 周长:{circle.calculate_circumference()}")# 2. 继承相关测试print("\n📏 2. 长方形类功能测试:")rect = Rectangle(4, 6)square = Rectangle(5, 5)print(f" 长方形 - 长:{rect.length}, 宽:{rect.width}")print(f" 长方形面积:{rect.calculate_area()}")print(f" 长方形周长:{rect.calculate_perimeter()}")print(f" 是否为正方形:{rect.is_square()}")print(f" 正方形是否为正方形:{square.is_square()}")# 3. 工厂模式测试print("\n🏭 3. 工厂模式功能测试:")shapes = [create_shape("circle", 3),create_shape("rectangle", 4, 5),create_shape("rectangle", 6), # 正方形create_shape("circle") # 默认圆]for i, shape in enumerate(shapes, 1):if isinstance(shape, Circle):print(f" 图形{i}: 圆,半径={shape.radius}, 面积={shape.calculate_area()}")elif isinstance(shape, Rectangle):print(f" 图形{i}: 长方形,长={shape.length}, 宽={shape.width}, 是否正方形={shape.is_square()}")if __name__ == "__main__":comprehensive_test()
@浙大疏锦行