← 返回 Day 33 正文

Day 33 · 练习与清单

Day 033 — 继承:完成清单与练习题

✅ 完成清单

概念理解

Python 实现

代码实践


📝 练习题

练习 1:实现员工继承体系

python
"""
实现员工继承体系:
- Employee: 基类 (name, salary, work())
- Manager: 继承 Employee (team_size, work() → "管理团队")
- Developer: 继承 Employee (language, work() → "写代码")
- Intern: 继承 Employee (mentor, work() → "学习")
- SalesPerson: 继承 Employee (quota, work() → "销售")

要求使用 super() 调用父类方法
"""
class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def work(self):
        return f"{self.name} 在工作"

    def __str__(self):
        return f"{self.__class__.__name__}: {self.name} (${self.salary})"

class Manager(Employee):
    def __init__(self, name, salary, team_size):
        super().__init__(name, salary)
        self.team_size = team_size

    def work(self):
        return f"{super().work()} → 管理 {self.team_size} 人团队"

# 完成其他子类...
# 测试:
# mgr = Manager("Alice", 80000, 10)
# dev = Developer("Bob", 70000, "Python")
# print(mgr.work())  # → Alice 在工作 → 管理 10 人团队
# print(dev.work())  # → Bob 在工作 → 用 Python 写代码

练习 2:学校继承体系

python
"""
实现学校人员继承体系:
- Person: 基类 (name, age)
- Student: 继承 Person (student_id, grades)
- Teacher: 继承 Person (subject, salary)
- TeachingAssistant: 继承 Student, Teacher (多继承, courses)

要求:
1. Student 和 Teacher 都继承 Person
2. TeachingAssistant 多重继承 Student 和 Teacher
3. 使用 super() 正确处理 MRO
4. TeachingAssistant 应该包含 student_id, grades, subject
"""
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        return f"我叫{self.name},{self.age}岁"

class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age)
        self.student_id = student_id
        self.grades = []

    def introduce(self):
        return f"{super().introduce()},学号{self.student_id}"

class Teacher(Person):
    # 你的代码
    pass

class TeachingAssistant(Student, Teacher):
    # 你的代码
    pass

# 测试
# ta = TeachingAssistant("张三", 22, "S2024001", "数据结构", ["CS101", "CS102"])
# print(ta.introduce())  # 正确显示身份
# print(TeachingAssistant.__mro__)  # 理解 MRO

练习 3:实现 DrawableMixin

python
"""
实现图形绘制系统的 Mixin。
要求:
1. ColoredMixin: 添加颜色属性
2. BorderMixin: 添加边框样式
3. AnimatableMixin: 添加动画方法

与形状类组合使用
"""
class ColoredMixin:
    """颜色 Mixin"""
    def set_color(self, color):
        self.color = color
        return self

    def get_color(self):
        return getattr(self, 'color', 'black')

class BorderMixin:
    """边框 Mixin"""
    def set_border(self, style="solid", width=1):
        self.border_style = style
        self.border_width = width
        return self

    def get_border(self):
        style = getattr(self, 'border_style', 'none')
        width = getattr(self, 'border_width', 0)
        return f"{width}px {style}"

class AnimatableMixin:
    """动画 Mixin"""
    def animate(self, animation="fadeIn"):
        return f"🎬 播放 {animation} 动画"

# 组合使用
class DrawableCircle(ColoredMixin, BorderMixin, AnimatableMixin):
    def __init__(self, radius):
        self.radius = radius

    def draw(self):
        color = self.get_color()
        border = self.get_border()
        return f"🎨 绘制 {color} 圆形(r={self.radius}), 边框: {border}"

# 测试
# c = DrawableCircle(5)
# c.set_color("red").set_border("dashed", 2)
# print(c.draw())      # → 🎨 绘制 red 圆形(r=5), 边框: 2px dashed
# print(c.animate())   # → 🎬 播放 fadeIn 动画

练习 4:自定义异常继承体系

python
"""
创建自定义异常继承体系:
- AppError: 基础异常
- ValidationError: 继承 AppError (字段名, 错误信息)
- AuthError: 继承 AppError (用户ID, 错误代码)
- NotFoundError: 继承 AppError (资源名, 资源ID)
- PermissionDeniedError: 继承 AuthError (所需权限)

要求:
1. 每个异常有额外的属性存储上下文信息
2. 使用 __str__ 返回详细的错误信息
3. 使用 try/except 按类型捕获
"""
class AppError(Exception):
    """应用基础异常"""
    def __init__(self, message, code="UNKNOWN"):
        super().__init__(message)
        self.code = code

    def __str__(self):
        return f"[{self.code}] {self.args[0]}"

# 完成子类...

# 测试
# try:
#     raise ValidationError("用户名不能为空", field="username")
# except ValidationError as e:
#     print(e)  # → [VALIDATION] 用户名不能为空 (field: username)
# except AppError as e:
#     print(f"应用错误: {e}")

练习 5:实现 Plugin 系统

python
"""
使用 __init_subclass__ 实现一个插件系统。
- PluginBase: 基类,自动注册子类
- TextPlugin: 文本处理插件
  - UpperPlugin: 转大写
  - ReversePlugin: 反转
  - CapitalizePlugin: 首字母大写
- NumberPlugin: 数字处理插件
  - DoublePlugin: 乘以2
  - SquarePlugin: 平方

要求:
1. 插件注册到 PluginBase._registry
2. 支持启用/禁用插件
3. 可以按类别获取插件
"""
class PluginBase:
    _registry = {}
    _enabled = {}

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        # 自动注册
        name = cls.__name__
        PluginBase._registry[name] = cls
        PluginBase._enabled[name] = True

    def process(self, data):
        raise NotImplementedError

    @classmethod
    def get_enabled_plugins(cls):
        return {n: c for n, c in cls._registry.items()
                if cls._enabled.get(n, False)}

# 完成插件实现...

# 测试
# pipeline = DataPipeline([UpperPlugin(), ReversePlugin()])
# result = pipeline.run("hello")
# print(result)  # OLLEH

📊 自评表

技能 初学者 理解 掌握 熟练
单继承 ☐ ☐ ☐ ☐
方法重写 ☐ ☐ ☐ ☐
super() 调用 ☐ ☐ ☐ ☐
MRO 理解 ☐ ☐ ☐ ☐
多重继承 ☐ ☐ ☐ ☐
Mixin 模式 ☐ ☐ ☐ ☐
isinstance vs type ☐ ☐ ☐ ☐
init_subclass ☐ ☐ ☐ ☐
抽象基类 ☐ ☐ ☐ ☐

🔗 参考资源