TypeError: object.__init__() takes no parameters
Duncan Booth
duncan.booth at invalid.invalid
Fri Sep 9 05:49:33 EDT 2011
Thomas Rachel <nutznetz-0c1b6768-bfa9-48d5-a470-7603bd3aa915
@spamschutz.glglgl.de> wrote:
> Am 09.09.2011 07:47 schrieb Oliver:
>> class Container(object):
>> """Container to store a number of non-overlapping rectangles."""
>> def __init__(self, xsize=1200, ysize=800):
>> super(Container, self).__init__(xsize, ysize)
>
> And this is the nonsense: Container derives from object and tries to
> call its superclass's constructor with 2 parameters - which won't work.
>
> Write this as super(Container, self).__init__().
>
It isn't nonsense, just poor and outdated practice. You might subclass
Container with something that puts another base class into the mro between
Container and object and in that case calling super(Container, self).
__init__() would be wrong.
object.__init__() used to accept and silently ignore any parameters. This
meant you could safely pass any constructor parameters along in case there
was an intervening base class that wanted them. However that was changed
(presumably after this code was written) and now you have to be a bit more
careful with your initialisation parameters.
This would be better in general, though if there is actually any code
depending on xsize,ysize being passed up to a base class it will still need
changing at the call site:
def __init__(self, xsize=1200, ysize=800, *args, **kw):
super(Container, self).__init__(*args, **kw)
That way any xsize and ysize arguments are removed but any additional
arguments for other base classes are passed through.
--
Duncan Booth http://kupuguy.blogspot.com
More information about the Python-list
mailing list