How can I store lists & dictionaries in an object?
You can store anything in a game property from python. You simply assign it:

obj['inventory'] = {'sword':3, 'armour':5}


It doesn't have to be present in the logic brick window.



Also, you can (and probably should) store the instance of your class rather than regenerate it each frame. You can do this in a number of ways including:


Using module mode and a global variable
Saving it in a game property
Saving it to bge.logic.globalDict


That way, __init__() isn't called every frame



The other thing you can do is you can mutate the game object. The API includes this example:

import bge

class CustomGameObject(bge.types.KX_GameObject):
    RATE = 0.05

    def __init__(self, old_owner):
        # "old_owner" can just be ignored. At this point, "self" is
        # already the object in the scene, and "old_owner" has been
        # destroyed.

        # New attributes can be defined - but we could also use a game
        # property, like "self['rate']".
        self.rate = CustomGameObject.RATE

    def update(self):
        self.worldPosition.z += self.rate

        # switch direction
        if self.worldPosition.z &gt; 1.0:
            self.rate = -CustomGameObject.RATE
        elif self.worldPosition.z &lt; 0.0:
            self.rate = CustomGameObject.RATE

# Called first
def mutate(cont):
    old_object = cont.owner
    mutated_object = CustomGameObject(cont.owner)

    # After calling the constructor above, references to the old object
    # should not be used.
    assert(old_object is not mutated_object)
    assert(old_object.invalid)
    assert(mutated_object is cont.owner)

# Called later - note we are now working with the mutated object.
def update(cont):
    cont.owner.update()


Which gives the game object the function 'update'