inheritance:super类在python中的作用是什么?

本问题已经有最佳答案,请猛点这里访问。

我不明白super在这里的用法?它是类、函数还是别的什么?

代码如下:

1
2
3
class Child(SomeBaseClass):
    def __init__(self):
        super(Child, self).__init__()

有人能解释一下下面这行代码吗?

1
super(Child, self).__init__()

1
super(Child, self).__init__() <=> SomeBaseClass.__init__(self)

它为调用父类上的方法提供了一个很好的简写,而不需要显式地输入它,这可能很长(程序员很懒),而且容易出错。如果稍后更改代码,使Child不再是SomeBaseClass而是AnotherBaseClass,则不必更改对构造函数的调用(这本身是必需的,因为默认情况下不会调用构造函数)

注意,这里的情况很明显,因为只有一个基类,但如果存在歧义(例如两个或多个父类),mro就会占上风(正如您所期望的那样,我认为,因为这就是它的内容):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
>>> class A(object):
...     def __init__(self):
...         print"A"
...
>>> class B(object):
...     def __init__(self):
...         print"B"
...
>>> class C(A, B):
...     def __init__(self):
...         super(C, self).__init__()
...             print"C"
...
>>> c = C()
A
C
>>> class D(B, A):
...     def __init__(self):
...         super(D, self).__init__()
...             print"D"
...
>>> d = D()
B
D
>>> class CC(A, B):
...     def __init__(self):
...         B.__init__(self) # Explicitely call B and not A !
...         print"CC"
...
>>> cc = CC()
B
CC

1
super(Child, self).__init__()

方法:使用实例self调用Child基类型的方法__init__。所以在您的例子中,这将等同于SomeBaseClass.__init__(self)。但是使用super可以避免再次显式地命名基类型,也适用于多重继承。

因此super(t, self)基本上意味着获取t类型的基类型,并将其绑定到实例self,以便您可以直接调用方法。

注意,在python3中,到super()的参数是可选的,所以super().__init__()可以工作。


__init__()是python中的构造函数,而super是继承类的父类。

1
2
3
class Child(SomeBaseClass):
    def __init__(self):
        super(Child, self).__init__()

对于这段代码,每当您贪得无厌Child类型的新对象时,它将调用构造函数__init__(),而构造函数反过来又调用SomeBaseClass.__init__().