What's the diffeernce between super(SomeClass, self).__init__()
AND super(SomeClass, self).__init__(*args, **kwargs)
? The first one initializes the constructor of the parent, but what about the second one?
Asked
Active
Viewed 48 times
-2

Ahmed Sadman
- 105
- 10
-
3This question keeps cropping up. The answer is the same each and every time, you are getting hung up over the `*args` and `**kwargs` syntax, not about `__init__` methods here. – Martijn Pieters May 08 '14 at 18:40
-
2See [Argument List Unpacking](https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists). – Lukas Graf May 08 '14 at 18:41
-
@MartijnPieters Thanks for your comment. I actually know about those STARS, and I have already told that. I am not a pro programmer, but it doesn't mean that I am too stupid to ask the same question again and again. Look at my elected BEST ANSWER, it clearly answers my question. – Ahmed Sadman May 08 '14 at 18:55
2 Answers
3
The second one calls the superclass' constructor with arguments.
Some demonstration:
>>> class Base(object):
... def __init__(self, arg1, arg2, karg1=None, karg2=None):
... print arg1, arg2, karg1, karg2
...
>>> b = Base(1, 2, karg2='a')
1 2 None a
>>> class Derived(Base):
... def __init__(self, *args, **kwargs):
... super(Derived, self).__init__(*args, **kwargs)
...
>>> d = Derived(1, 2, karg1='Hello, world!')
1 2 Hello, world! None
>>> class Derived2(Base):
... def __init__(self):
... super(Derived2, self).__init__() # this will fail because Base.__init__ does not have a no-argument signature
...
>>> d2 = Derived2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
TypeError: __init__() takes at least 3 arguments (1 given)

Santa
- 11,381
- 8
- 51
- 64
1
super(SomeClass, self)
returns a proxy object that stands in for some class (not necessarily the parent of SomeClass
, if multiple inheritance is involved). As such, you need to pass the appropriate argument to its __init__
method. If it expects arguments, the first will fail. If it expects no arguments, the second one may fail, if args
and kwargs
aren't already empty.

chepner
- 497,756
- 71
- 530
- 681