I'm not quite sure what you are missing, so let me put on some basic elements.
There are two “special” names for intialization in the Python class object, which are relatively rare for users, called __new__ , and a more common one, called __init__ .
When calling the constructor of the object class, for example. (based on your example) x = Game(args) , this first calls Game.__new__ to get memory to hold the object, and then Game.__init__ to fill that memory. In most cases, you can let the underlying object.__new__ allocate memory, and you just need to fill it up. (You can use your own dispenser for special strange rare cases, such as objects that never change and can share identifiers, for example, ordinary "ordinary" integers, as well as for "metaclasses" that do strange things, but all this topic much later.)
Your Game.__init__ is called with "all constructor arguments" plus one hidden in front, which is the memory allocated for this object. (For "ordinary" objects, which are mainly a dictionary of "attributes", plus magic glue for classes, but for objects with __slots__ attribute dictionary is omitted.) The naming of this first argument self is just a convention, but don Violate this, people will hate it you if you do this. :-)
There is nothing that requires you to save all the constructor arguments. You can set any or all instance attributes that you like:
class Weird(object): def __init__(self, required_arg1, required_arg2, optional_arg3 = 'spam'): self.irrelevant = False def __str__(self): ...
The fact is that after initialization, the Weird () instance is pretty useless, because you need to pass two arguments that are just thrown away and give a third optional argument, which is also discarded:
x = Weird(42, 0.0, 'maybe')
The only point requiring dropped arguments is to expand further (you might have these unused fields during early development). Therefore, if you do not immediately use and / or store the arguments in __init__ , something is definitely strange in Weird .
By the way, the only reason to use (object) in a class definition is to tell Python 2.x that it is a "new style" class (as opposed to the "only for very old Python instances" classes), but it’s best to use it - it does that that I said above object.__new__ true, for example :-) -until Python 3, where old-style things completely disappeared.