Python子类调用父类__init__的区别

Python子类调用父类__init__的区别

问题出现

在使用框架来编写深度学习模型时,经常要继承框架提供的父类。

1
2
3
4
import torch.nn as nn

class MyModel(nn.Module):
pass

然后通常我们要调用父类的构造方法

1
2
3
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()

然而我之前学习到的调用父类构造方法的用法是

1
2
3
class MyModel(nn.Module):
def __init__(self):
super().__init__()

因此就想知道这两种调用的方式有什么区别。

通过查询资料,有两种说法,一种是说只有带参数调用才能将父类的操作应用到子类身上,另一种说法是带参数调用是Python2的语法,在Python3中可以直接用不带参数的语法替代。

问题验证

我们编写一个父类,然后编写两个子类用不同的方式来调用父类的__init__方法

  • 父类

    1
    2
    3
    class SuperClass:
    def __init__(self):
    self.a = 'hello'
  • 带参数调用

    1
    2
    3
    class SubClass1(SuperClass):
    def __init__(self):
    super(SubClass1, self).__init__()
  • 不带参数调用

    1
    2
    3
    class SubClass2(SuperClass):
    def __init__(self):
    super().__init__()

然后我们创建两个子类的对象,查看它们之间是否有所不同

1
2
3
4
obj1 = SubClass1()
obj2 = SubClass2()
print(dir(obj1))
print(dir(obj2))

问题结果

通过执行结果可以发现,在Python3里两种方式没有任何区别,所以使用Python3的时候,就不用再多写这几个东西了。


Python子类调用父类__init__的区别
https://wellt.cn/2023/07/24/py-super-init-invoke/
作者
caojingchen
发布于
2023年7月24日
许可协议