Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object initialization. However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. Therefore the developer has responsibility for ensuring that objects are properly initialized when there are multiple __init__ methods that need to be called.

Calling an __init__ method more than once during object initialization risks the object being incorrectly initialized. It is unlikely that the relevant __init__ method is designed to be called more than once.

There are a number of ways that an __init__ method may be be called more than once.

Either be careful not to explicitly call an __init__ method more than once, or use super() throughout the inheritance hierarchy.

Alternatively refactor one or more of the classes to use composition rather than inheritance.

In the first example, explicit calls to __init__ are used, but SportsCar erroneously calls both Vehicle.__init__ and Car.__init__. This can be fixed by removing the call to Vehicle.__init__, as shown in FixedSportsCar.

In the second example, there is a mixture of explicit calls to __init__ and calls using super(). To fix this example, super() should be used throughout.

  • Python Tutorial: Classes.
  • Python Standard Library: super.
  • Artima Developer: Things to Know About Python Super.
  • Wikipedia: Composition over inheritance.