2

我无法理解super这里的术语用法?它是一个类或函数还是其他什么?

从下面的代码:

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

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

super(Child, self).__init__()
4

3 回答 3

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

它为调用父类上的方法提供了一个很好的简写,而无需显式键入它,这可能很长(程序员很懒)并且容易出错。如果您稍后更改代码,不再Child是 aSomeBaseClass而是 a 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
于 2013-11-01T19:05:31.873 回答
0

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

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

对于此代码,每当您对类型的新对象感到不满时,Child它都会调用其构造函数,而构造函数__init__()又会调用SomeBaseClass.__init__().

于 2013-11-01T19:01:52.513 回答
0
super(Child, self).__init__()

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

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

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

于 2013-11-01T19:02:26.613 回答