How does BGE handle Python class definitions? I have a game (toy) that works in PyGamek, and I'm trying to port it to Blender. I'm very familiar with both Blender and Python individually, but not together.

In this case, I have a class called "Critter." Each critter knows how to do things like drawSelf() and chooseNewOrientation() and predate(other_critter) and getPredated(other_critter) other fun things like that.

What is the "Blenderic" method for me to implement this class in BGE? 

It seems like each OBJECT (mesh) is the parallel to an instance of the class, and that has worked well enough. But I suspect that if I just define the class in a script and attach it to an object (even a single object that never gets duplicated), the class will get defined every frame... which I'd like to avoid, obviously. Right now, I have individual functions in a script on each critter, and that works well enough so long as those are static functions (or would qualify to be static). I'm not sure how to handle things like class member functions/variables. I.e. it'd be nice for each critter to have a "self.diameter" that can tell the "self.drawSelf()" function how big this instance is supposed to be.

So, what's the best way (conceptually) to handle the equivalent of a class in BGE that can spawn instances of itself, which know about members?
There are a couple of ways. Here is a simple one:

Write your class e.g. Character.

Character object knows the game objects of the character.

class Character():
    def __init__(self):
        self.skeleton = None
        self.leftHand = None
        self.rightHand = None
        ...

# builder
character = Character()
character.skeleton = scene.objects["Armature"]
character.leftHand = scene.objects["Hand.L"]
...


The game objects might need to know the Character object too:

character.skeleton["character"] = character
character.leftHand["character"] = character


This way you get a cross reference. When you know one of the game objects you can get the according character:

character = gameObject["character"]


When you know the character instance you do not need to dig through the properties anymore.

You could create a factory that establishes these cross references. This keeps this "management" code away from the character's behavior.

You can dynamically exchange references. E.g. the character grabs a book. So you can assign the book to the right hand. You character eats the apple it holds in right hand, you can remove the link between the apple and the right hand, then you can end the apple.

Be aware the BGE events are always applied to game objects (such as collision, ray ...). As said you can get the python character via property.

myCharacter = owner["character"]
hitObject = sensor.hitObject
hitCharacter = hitObject["character"]