The __init__() method is a profound feature of Python class definitions for two reasons. Firstly, initialization is the first big step in an object's life; every object must have its state initialized properly. The second reason is that the argument values for __init__() can take many forms.
Because there are so many ways to provide argument values to __init__(), there is a vast array of use cases for object creation. We'll take a look at several of them. We want to maximize clarity, so we need to define an initialization that characterizes the problem domain and clearly sets the state of the object.
Before we can get to the __init__() method, however, we need to take a look at the implicit class hierarchy in Python, glancing briefly at the class named object. This will set the stage for comparing its default behavior with the different kinds of...