python:模板方法模式

部署运行你感兴趣的模型镜像

0. 引入

        有时我们会看到这样的写法:父类在自己的方法里调用一个由子类实现的函数。对不熟悉这种结构的人来说,可能会疑惑:“为什么父类能调用子类的方法?不是应该子类调用父类吗?”

        其实,这并不奇怪。这种结构恰好就是典型的 模板方法模式

1. 什么是模板方法模式?

        模板方法模式(Template Method Pattern)是一种非常经典的面向对象设计模式。

        它的核心思想是:

父类定义一套固定的执行流程(模板),
子类在不改变整体流程的情况下,重写其中的步骤。

        换句话说:

                父类负责“流程”

                子类负责“细节”

        父类的前向传播会依次调用一些方法,而这些方法最终由子类来实现。


2. 示例:神经网络的前向传播

父类 A:定义完整的 forward 模板

class A(nn.Module):
    def __init__():
        ...

    def forward(self, x):
        # 前置模块
        x = self._forward_block(x)

        # 主模块
        x = self._forward_block2(x)
        return x

父类 A 做了三件事:

  1. 定义前向传播流程(block → block2)

  2. 把关键步骤拆成方法

  3. 各个方法由子类来实现


子类 B:实现后半部分 block

class B(A):
    def __init__():
        ...

    def _forward_block(self, x):
        # 主模块实现
        return self.fc(x)

子类 C:实现前半部分 block2

class C(A):
    def __init__():
        ...

    def _forward_block2(self, x):
        return self.preprocess(x)

4. 整体调用流程

无论你实例化的是 B 还是 C:

model = B()  # 或 C
out = model(x)

执行顺序始终来自父类 A:

1. 先执行 block2(子类实现)
2. 再执行 block(子类实现)

这就是模板方法模式的核心:

父类决定调用顺序,子类决定干什么。


5. 模板方法模式的优点(结合你当前项目)

✔ 1)父类统一流程,所有子类保持一致结构

你希望前向传播永远是:
block2 → block

那么只需在 A 中写一次。

✔ 2)子类只实现差异部分,代码更简洁

B 只管自己的模块,C 只管自己的模块,不会影响整体流程。

✔ 3)支持灵活扩展

未来可加入:

  • _forward_block3

  • _forward_block_attention

  • _forward_block_adapter

而不用改现有子类大量代码。

✔ 4)项目结构更专业

这正是 PyTorch、MMCV、Transformers 的常用写法。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值