【问题标题】:what does <class 'super'>class do in python? [duplicate]<class 'super'>class 在 python 中做了什么? [复制]
【发布时间】:2013-11-13 01:13:27
【问题描述】:

这里我看不懂super这个词的用法?它是一个类或函数还是其他什么?

从下面的代码:

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

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

super(Child, self).__init__()

【问题讨论】:

    标签: python inheritance


    【解决方案1】:
    super(Child, self).__init__() <=> SomeBaseClass.__init__(self)
    

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

    请注意,这里的情况很明显,因为只有一个基类,但在存在歧义的情况下(例如两个或更多父类),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
    

    【讨论】:

      【解决方案2】:
      super(Child, self).__init__()
      

      意思是:用实例self调用Child基类型的方法__init__。所以在你的情况下,这相当于SomeBaseClass.__init__(self)。但是使用super 可以避免再次显式命名基类型,并且也适用于多重继承。

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

      请注意,在 Python 3 中,super() 的参数是可选的,因此 super().__init__() 有效。

      【讨论】:

      【解决方案3】:

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

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

      对于这段代码,每当你满足Child 类型的新对象时,它将调用其构造函数__init__(),而后者又调用SomeBaseClass.__init__().

      【讨论】:

      • 那么我们为什么要覆盖 init 呢?
      • 你没有覆盖它,每个类都有它的 __init__() 并且永远不要从 super 继承它或将它给孩子。它就像 c++ 或 java 中的构造函数。你在这里做的是从子类init调用基类init。
      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 2021-08-21
      • 2010-09-08
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多