[Tutor] inheritance and super() function in python

Steven D'Aprano steve at pearwood.info
Tue Apr 22 16:51:46 CEST 2014

On Tue, Apr 22, 2014 at 09:48:51AM -0400, Jorge Leon wrote:
> Good day,
> I have programmed a base class for an environment I have with no problem,
> but when it comes to referencing the base class's constructor in the
> derived class's constructor I have been getting errors:

What version of Python are you using? With super, that is actually 

> *TypeError: Error when calling the metaclass bases*
> *    module.__init__() takes at most 2 arguments (3 given)*

Read the error message. Why is it refering to *module*.__init__?

My guess is that you have a module called Obstacle, and a class called 
Obstacle, and you have mixed them up. Maybe you are doing this:

# file Obstacle.py
class Obstacle: 
    # code goes here

# Another file

import Obstacle
class Cylinder(Obstacle)

I can reproduce your error that way:

py> import math
py> class X(math):
...     pass
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: module.__init__() takes at most 2 arguments (3 given)

You need to say

class Cylinder(Obstacle.Obstacle)

Better still, use the naming convention that modules are in lowercase, 
and classes in CamelCase:

import obstacle
class Cylinder(obstacle.Obstacle):

Even better still, Python is not Java. There is no need to put every 
class in its own file. 

> Here's how my base class' constructor looks like (position =  [x, y, z]):
> *class Obstacle:*
> *    def __init__(self,position):*
> *        self.position = position*

In Python 2, that is a "classic class", or old-style class, and super 
will not work correctly. You need to inherit from object:

class Obstacle(object)

In Python 3, there is no difference and it should be fine.


More information about the Tutor mailing list