<class'super'> class在python中做了什么?
这个问题在这里已经有了答案:
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
super(Child, self).__init__()
意思是:用实例self
调用基类Child
的方法__init__
。 所以在你的情况下,这将相当于SomeBaseClass.__init__(self)
。 但是使用super
可以避免再次明确命名基类型,也适用于多继承。
所以super(t, self)
基本上意味着获得类型t
的基类型,并将其绑定到实例self
以便您可以直接调用方法。
请注意,在Python 3中, super()
的参数是可选的,所以super().__init__()
可以工作。
__init__()
是python中的构造函数, super
是您从中继承类的父类。
class Child(SomeBaseClass):
def __init__(self):
super(Child, self).__init__()
对于这段代码,无论何时你试图创建一个类型为Child
的新对象,它都会调用其构造函数__init__()
,该构造函数依次调用SomeBaseClass.__init__().