← 返回 Day 48 正文

Day 48 · 图解

Day 048 — 混入(Mixin)图解

Mixin 组合模式

classDiagram class SerializationMixin { +to_dict() dict +to_json() str +from_json(json_str) object } class LoggingMixin { +log(message) +log_operation(op_name) } class ValidationMixin { +_validate_field(name, value, rules) List~str~ } class CacheMixin { +cached(method, *args) +clear_cache() } class User { +name: str +email: str +age: int +role: str +login() } class UserManager { +add_user(name, email) +get_user(id) User +find_users(**kwargs) List +stats() dict } User --|> SerializationMixin User --|> LoggingMixin User --|> ValidationMixin UserManager --|> LoggingMixin UserManager --|> CacheMixin
classDiagram
    class SerializationMixin {
        +to_dict() dict
        +to_json() str
        +from_json(json_str) object
    }
    class LoggingMixin {
        +log(message)
        +log_operation(op_name)
    }
    class ValidationMixin {
        +_validate_field(name, value, rules) List~str~
    }
    class CacheMixin {
        +cached(method, *args)
        +clear_cache()
    }
    class User {
        +name: str
        +email: str
        +age: int
        +role: str
        +login()
    }
    class UserManager {
        +add_user(name, email)
        +get_user(id) User
        +find_users(**kwargs) List
        +stats() dict
    }

    User --|> SerializationMixin
    User --|> LoggingMixin
    User --|> ValidationMixin
    UserManager --|> LoggingMixin
    UserManager --|> CacheMixin

MRO 查找顺序

class D(B, C):
    pass

继承关系图:

    D
   / \
  B   C
   \ /
    A
    |
  object

MRO 顺序: D → B → C → A → object

C3 线性化算法:
- 从左到右合并父类列表
- 检查是否有重复引用
- 确保子类在父类之前

Mixin vs 继承 vs 组合

┌──────────────────────────────────────────────────────┐
│                    设计模式对比                        │
├──────────────┬──────────────┬───────────────────────┤
│   继承(Inheritance)    │  Mixin        │  组合(Composition)    │
├──────────────┼──────────────┼───────────────────────┤
│ "是一种"关系  │ "能做某事"   │ "有一个"关系            │
│ (is-a)       │ (can-do)     │ (has-a)               │
├──────────────┼──────────────┼───────────────────────┤
│ 紧耦合       │ 松耦合       │ 独立                   │
│ 父类变化影响 │ Mixin 可独立 │ 组件可替换              │
│ 子类         │ 修改         │                       │
├──────────────┼──────────────┼───────────────────────┤
│ 功能完整     │ 单一能力     │ 功能完整               │
│ 封装         │ 增强         │ 封装                   │
├──────────────┼──────────────┼───────────────────────┤
│ class Dog    │ class Dog    │ class Dog:             │
│   (Animal):  │ (BarkMixin): │   self.bark =          │
│   pass       │   pass       │     BarkBehavior()     │
└──────────────┴──────────────┴───────────────────────┘