When you call Game("central_corridor") , a new object is created, and the Game.__init__() method is called with this new object as the first argument ( self ) and "central_corridor" as the second argument. Since you wrote a_game = Game(...) , you assigned a_game to reference this new object.
This graphic can simplify the process:

Note. The __new__ method __new__ provided by Python. It creates a new class object specified as the first argument. The __new__ built-in method __new__ nothing with the rest of the arguments. If you need to, you can override the __new__ method and use other arguments.
The practical reason __init__() exists in your program is to set the start attribute on the Game instance you created (the one you call a_game ), so the first call to a_game.play() starts where you want.
You are right about quips . There is no reason to set quips in __init__() . You can simply make it an attribute of the class:
class Game(object): quips = ["You died. Please try again.", "You lost, better luck next time.", "Things didn't work out well. You'll need to start over." "You might need to improve your skills. Try again." ] def __init__(self, start): self.start = start
source share