我在这里无法理解super
术语的用法?它是一个阶级或功能还是别的什么?
从下面的代码:
class Child(SomeBaseClass):
def __init__(self):
super(Child, self).__init__()
有人可以在下面解释这行代码吗?
super(Child, self).__init__()
答案 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