课程 20:类(Class)

学习目标

1. 类与对象基础

1.1 类和对象的现实意义与历史

现实意义: 类让我们能用代码模拟现实世界的对象和关系,便于建模和管理复杂系统。
历史: OOP思想起源于Simula、Smalltalk,现已成为主流编程范式。
对比: 类/对象 vs 结构化编程:前者强调抽象和复用,后者强调流程和数据分离。

1.2 类的定义与实例化

# 定义类和创建对象
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
stu = Student('Alice', 95)
print(stu.name, stu.score)
常用术语:
• 属性:对象的数据(如name、score)
• 方法:对象的行为(如show_score)
• 构造函数:__init__,用于初始化对象
• 析构函数:__del__,对象销毁时自动调用

2. 属性与方法细化

2.1 实例属性、类属性、私有属性

class Student:
    school = 'YunfanEdu'  # 类属性
    def __init__(self, name, score):
        self.name = name      # 实例属性
        self._secret = '私有数据'  # 约定私有属性
stu = Student('Bob', 88)
print(stu.name, stu.school)
print(stu._secret)  # 不建议外部访问

2.2 方法类型:实例方法、类方法、静态方法

class Demo:
    def instance_method(self):
        print('实例方法')
    @classmethod
    def class_method(cls):
        print('类方法')
    @staticmethod
    def static_method():
        print('静态方法')
d = Demo()
d.instance_method()
Demo.class_method()
Demo.static_method()

2.3 属性封装与getter/setter

class Person:
    def __init__(self, age):
        self._age = age
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self, value):
        if value < 0:
            raise ValueError('年龄不能为负')
        self._age = value
p = Person(18)
p.age = 20
print(p.age)
建议: 用@property保护属性安全,便于后期维护和扩展。

3. 魔法方法与调试技巧

3.1 __str__、__repr__、__eq__等

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def __str__(self):
        return f"Student({self.name}, {self.score})"
    def __eq__(self, other):
        return self.name == other.name and self.score == other.score
stu1 = Student('Alice', 95)
stu2 = Student('Alice', 95)
print(stu1)
print(stu1 == stu2)
调试技巧: __str__和__repr__便于打印对象,__eq__等便于对象比较。

4. 继承、多态、组合与高级OOP

4.1 继承与super()

class Animal:
    def speak(self):
        print('动物叫')
class Dog(Animal):
    def speak(self):
        super().speak()
        print('汪汪!')
d = Dog()
d.speak()

4.2 多态与鸭子类型

class Cat:
    def speak(self):
        print('喵喵!')
def animal_speak(animal):
    animal.speak()
for a in [Dog(), Cat()]:
    animal_speak(a)

4.3 组合与MRO

class Engine:
    def start(self):
        print('发动机启动')
class Car:
    def __init__(self):
        self.engine = Engine()  # 组合
    def drive(self):
        self.engine.start()
        print('汽车行驶')
car = Car()
car.drive()
print(Car.__mro__)
OOP进阶: 组合优于继承,MRO(方法解析顺序)影响多重继承下方法调用。

5. 类的实际应用案例

5.1 学生成绩管理

class Student:
    def __init__(self, name):
        self.name = name
        self.scores = {}
    def add_score(self, subject, score):
        self.scores[subject] = score
    def show_all(self):
        print(f"{self.name}的成绩:")
        for subject, score in self.scores.items():
            print(f"  {subject}: {score}")
stu = Student('Alice')
stu.add_score('Math', 95)
stu.add_score('English', 88)
stu.show_all()

5.2 银行账户与工厂模式

class Account:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance
    def deposit(self, amount):
        self.balance += amount
    def withdraw(self, amount):
        if amount > self.balance:
            print('余额不足')
        else:
            self.balance -= amount
class AccountFactory:
    @staticmethod
    def create_account(owner):
        return Account(owner)
acc = AccountFactory.create_account('Tom')
acc.deposit(100)
print(acc.balance)

5.3 图形类与方法扩展

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    def area(self):
        return self.width * self.height
    def perimeter(self):
        return 2 * (self.width + self.height)
    def is_square(self):
        return self.width == self.height
rect = Rectangle(3, 4)
print('面积:', rect.area())
print('周长:', rect.perimeter())
print('是否正方形:', rect.is_square())
实际应用: 类常用于建模现实世界对象、管理数据、实现复杂逻辑、封装第三方库、设计模式等。

6. 常见错误与调试

# __str__和__repr__调试
class Demo:
    def __repr__(self):
        return ''
print(Demo())
# isinstance判断
print(isinstance(rect, Rectangle))

7. 编程练习与挑战

练习1:基础操作

练习2:进阶技巧

练习3:实战项目

8. 综合作业与项目

作业20:类的综合应用

任务1:学生成绩分析系统

实现一个系统,支持录入多个学生的多门课程成绩,统计每个学生的平均分、最高分、最低分,并能按课程统计全班平均分。

任务2:图形管理系统

实现一个图形管理系统,支持添加多种图形对象,计算总面积、最大面积、最小面积等。

任务3:OOP设计模式实践

实现单例、工厂、观察者等常见OOP设计模式的Python代码示例。

任务4(可选扩展):

用UML类图工具画出你的类结构,并分析其高内聚、低耦合特性。

学习建议:类是OOP的基础,建议多动手实践,理解属性、方法、继承、多态、组合、设计模式等核心概念,遇到报错要学会调试和查文档。推荐多用__str__/__repr__、isinstance、UML等工具辅助调试和设计。
思考题:类和对象的区别是什么?如何设计一个高内聚、低耦合的类?OOP有哪些常见误区,如何避免?组合和继承如何选择?UML类图在设计中的作用?