在Python中<class'super'=“”>类做什么?</class>

时间:2013-11-01 18:56:35

标签: python inheritance

我在这里无法理解super术语的用法?它是一个阶级或功能还是别的什么?

从下面的代码:

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

有人可以在下面解释这行代码吗?

super(Child, self).__init__()

3 个答案:

答案 0 :(得分:0)

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

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

对于此代码,每当您为Child类型的新对象进行内容时,它将调用其构造函数__init__(),而后者又调用SomeBaseClass.__init__().

答案 1 :(得分:0)

super(Child, self).__init__()

表示:使用实例__init__调用基本类型Child的方法self。所以在你的情况下,这相当于SomeBaseClass.__init__(self)。但是使用super可以避免再次明确地命名基类型,也可以用于多重继承。

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

请注意,在Python 3中,super()的参数是可选的,因此super().__init__()可以正常工作。

答案 2 :(得分:0)

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

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

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

>>> 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