Question
pytorch 中定义的神经网络类的 __init__()
中,经常定义 super(类名, self).__init__()
, 解释下这句话。比如:
class TestNN(nn.Module):
# 初始化函数
def __init__(self, parm1, ...):
super(TestNN, self).__init__()
pass
Answer
这其实是 python 中的魔术方法。
__init__()
方法在 Python 中通常被称为“初始化方法”或“构造器”,但它并不是严格意义上的构造函数。在 Python 中,构造函数实际上是 __new__()
方法,而 __init__()
方法是在对象创建后进行初始化的方法。
让我们重新聚焦在选定的代码上:
super(类名, self).__init__()
详细解释
-
super(类名, self)
:super()
是一个内置函数,用于调用父类的方法。类名
是当前类的名称。self
是当前类的实例。super(类名, self)
返回一个临时对象,该对象允许调用类名
类的父类的方法。
-
__init__()
:__init__()
是类的初始化方法,用于在对象创建后进行初始化。- 通过调用
super(类名, self).__init__()
,实际上是在调用类名
类的父类的初始化方法。
主要功能
这段代码的主要功能是调用 类名
类的父类 nn.Module
的初始化方法,以确保 nn.Module
的初始化逻辑得以执行。这样做的好处是,类名
类能够继承 nn.Module
的所有属性和方法,从而成为一个有效的 PyTorch 神经网络模块。
通过这种方式,类名
类可以在不重复编写 nn.Module
的初始化代码的情况下,利用 nn.Module
提供的功能,如参数管理、前向传播等。
总结
虽然 __init__()
不是严格意义上的构造函数,但在 Python 中,它通常被称为构造器,因为它在对象创建后立即执行,用于初始化对象的状态。这段代码的主要功能是确保 类名
类的父类 nn.Module
的初始化逻辑得以执行,从而继承其所有功能。