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.

If the __init__ method of a superclass is not called during object initialization it is likely that that object will end up in an incorrect state.

A call to the __init__ method of a superclass during object initialization may be omitted:

Either be careful to explicitly call the __init__ of the correct base class, or use super() throughout the inheritance hierarchy.

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

In this example, explicit calls to __init__ are used, but SportsCar erroneously calls Vehicle.__init__. This is fixed in FixedSportsCar by calling Car.__init__.

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