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 做了三件事:
-
定义前向传播流程(block → block2)
-
把关键步骤拆成方法
-
各个方法由子类来实现
子类 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 的常用写法。
861

被折叠的 条评论
为什么被折叠?



