Python中super(ParserModel, self).__init__()与super().__init__()的区别
两种super()调用方式的差异解析
在你这个继承自nn.Module的ParserModel类里,两种调用父类构造方法的写法,核心作用都是触发nn.Module的初始化逻辑,完成模型基础结构的搭建(比如参数注册、设备管理等),但两者存在以下差异:
1. 语法与版本兼容性
super(ParserModel, self).__init__()是Python 2的标准写法,Python 3也兼容,但必须手动传入当前类(ParserModel)和实例对象(self)。super().__init__()是Python 3.0及以上版本推出的简化语法,不需要显式传参,解释器会自动从当前类的上下文里推断出对应的类和实例。
2. 代码维护性
- 显式写法的弊端:如果后续修改子类名称(比如把
ParserModel改成DependencyParserModel),必须同步修改super里的类名,否则会触发错误。 - 隐式写法的优势:子类改名时不需要改动这行代码,减少了人为出错的概率,代码更易维护。
3. 多重继承场景的细微差别(单继承下无影响)
在单继承(比如你的代码只继承nn.Module)的场景下,两种写法的运行效果完全一致。但如果是多重继承的复杂场景,显式指定类的写法可以手动控制MRO(方法解析顺序)的起始查找点,而隐式写法则严格遵循当前类的MRO顺序。不过大部分PyTorch模型都是单继承,这个差异一般用不上。
针对你的代码场景总结
在你当前的ParserModel单继承nn.Module的代码里,换成super().__init__()后,实际功能完全没有变化,一样能正确完成父类的初始化。现在PyTorch已经完全放弃Python 2支持,新项目里推荐使用更简洁的super().__init__()写法。
内容的提问来源于stack exchange,提问作者dsoum
相关产品推荐
相关产品推荐

