Python 为什么PyTorch定制模块中需要超级构造函数?

Python 为什么PyTorch定制模块中需要超级构造函数?,python,inheritance,pytorch,super,Python,Inheritance,Pytorch,Super,为什么在下面的代码中需要调用super(LR,self)。\uuuu init\uuuu()?我得到错误“AttributeError:无法在模块之前分配模块。init()调用”否则。该错误是由self.linear=nn.linear(输入大小、输出大小)引起的 我不明白调用super(LR,self)。\uuu init\uuu()和能够将nn.Linear对象分配给self.Linear之间有什么联系。nn.Linear是一个单独的对象,可以分配给任何类之外的变量,那么为什么需要调用sup

为什么在下面的代码中需要调用
super(LR,self)。\uuuu init\uuuu()
?我得到错误“AttributeError:无法在模块之前分配模块。init()调用”否则。该错误是由
self.linear=nn.linear(输入大小、输出大小)
引起的

我不明白调用
super(LR,self)。\uuu init\uuu()
和能够将nn.Linear对象分配给self.Linear之间有什么联系。nn.Linear是一个单独的对象,可以分配给任何类之外的变量,那么为什么需要调用
super(LR,self)。\uuu init\uuu()
将线性对象分配给类内的self.Linear

class LR(nn.Module):
    
    # Constructor
    def __init__(self, input_size, output_size):
        
        # Inherit from parent
        super(LR, self).__init__()
        self.test = 1
        self.linear = nn.Linear(input_size, output_size)
        
    
    # Prediction function
    def forward(self, x):
        out = self.linear(x)
        return out
您需要super()调用,以便初始化mn.Module类本身。在Python中,不会自动调用超类构造函数/初始化器-必须显式调用它们,而super()就是这样做的-它会确定要调用的超类

我假设您使用的是Python 3—在这种情况下,您不需要super()调用中的参数—这就足够了:

        super().__init__()

在自定义类中编写
self.linear=nn.linear(…)
时,实际上是在调用类的
\uuuu setattr\uuuu
函数。恰好当您扩展
nn.Module
时,您的类继承了很多东西,其中之一就是。正如您在实现中所看到的(我只发布下面的相关部分),如果
nn.Linear
nn.Module
的实例,则您的类必须具有名为
\u modules
的属性,否则它将抛出您得到的
AttributeError

def\uuu setattr\uuuu(self,name:str,value:Union[Tensor,'Module'])->无:
# [...]
模块=自.uuu dict.get(“u模块”)
如果isinstance(值、模块):
如果模块为无:
raise AttributeError(“无法在module.\uuu init\uuu()调用之前分配模块”)
从(self.\u dict\u,self.\u参数,self.\u缓冲区,self.\u非持久性\u缓冲区集)中删除
模块[名称]=值
如果您查看
nn.Module
,您将看到
self.\u modules
在那里初始化:

def\uuuu初始化(自):
"""
初始化内部模块状态,由nn.Module和ScriptModule共享。
"""
torch.\u C.\u log\u api\u用法\u一次(“python.nn\u模块”)
自我训练=真实
self.\u参数=OrderedDict()
self.\u buffers=OrderedDict()
self.\u非\u持久性\u缓冲区\u集=集()
self.\u backward\u hooks=OrderedDict()
self.\u forward\u hooks=OrderedDict()
self.\u forward\u pre\u hooks=OrderedDict()
self.\u state\u dict\u hooks=OrderedDict()
self.\u load\u state\u dict\u pre\u hooks=OrderedDict()

self._modules=OrderedDict()#是的。我深入调查了来源并找到了答案。谢谢你抽出时间来回答。@ CMODY7.77开源是最好的:如果你认为这回答了你的问题并且可能对其他人有帮助,考虑把它投票或标记为答案。