TensorFlow自定义模型继承中super()两种写法的差异探究
两种super()写法的区别解析
这两种写法本质就是Python的新旧语法差异,具体区别如下:
super().__init__():这是Python 3引入的简化写法,不用显式指定当前类和self参数,解释器会自动根据上下文推断出当前类和实例对象,代码更简洁易读。super(ResNet, self).__init__():这是Python 2的标准写法,必须显式传入当前类名和self实例,在Python 3中也能兼容,但写法相对繁琐。
你测试两种写法结果一致的原因很简单:
- 两种写法最终都是调用父类
tf.keras.Model的__init__方法,初始化逻辑完全相同 - 你的ResNet属于单继承场景(只继承自
tf.keras.Model),这种情况下两种写法的效果没有任何区别
只有在多继承的复杂场景下,两种写法才可能产生差异:Python 3的简化写法会遵循*MRO(方法解析顺序)*自动处理,而显式指定类名的写法可以手动指定从哪个父类开始查找方法,但这种场景在Keras自定义模型里很少碰到。
总结一下,在Python 3环境下,推荐用super().__init__()的简化写法,代码更简洁,而且完全兼容现有逻辑。
内容的提问来源于stack exchange,提问作者Arslan Gabdulkhakov
相关产品推荐
相关产品推荐

