Blender doesn’t really do inheritance and classes, at least not in a way you’d expect. For all intents and purposes, there is only a single Object type for scene objects, and a handful of datablock types (Mesh,Lamp,Camera…). Any specialization is done through the datablock type. It’s not possible to add your own datablock type from Python.
Also, you cannot instantiate objects from Python. What you need to do is create objects through the libraries that contain them:
This creates an ‘EMPTY’ type object:
my_ob = bpy.data.objects.new('my_ob',data=None)
my_ob.type # 'EMPTY'
If instead you want to create a Mesh object, you need to also supply a mesh:
my_mesh = bpy.data.meshes.new('my_mesh') # a new empty mesh
my_ob = bpy.data.objects.new('my_ob',data=my_mesh)
my_ob.type # 'MESH'
Note that the ‘data’ argument defines the object type, the data for a ‘MESH’ is created through the respective datablock collection (bpy.data.meshes), similar for ‘LAMP’ (bpy.data.lamps), ‘CAMERA’ (bpy.data.cameras) and so on.
It’s also important to mention that the references you get from .new() are just python wrappers. You should not store them, because any undo/redo can make them invalid and accessing them afterwards can crash Blender. You should get your reference from the datablock collection instead. This is where the .name property becomes important.
my_ob = bpy.data.object.new('some_name',data=None)
my_ob.name # may or may not be 'some_name'!
Since there could already be an object called ‘some_name’, the name might be generated like this ‘some_name.001’. If you have the name, you can get a reference through the datablock collection:
my_ob = bpy.data.objects['some_name']
Another complication is that datablocks can be renamed without you being notified. Together with the inability to store references, that means it is impossible to reliably track objects across multiple script invocations in a reasonable manner.
Blender makes it really really really cumbersome to have something like your own scene object type, what you can do however is add custom properties to all objects using bpy.props:
bpy.types.Object.my_number = bpy.props.IntProperty(default=1)
Now all objects have a my_number property that you can use as you please. It will be serialized in the .blend file, too, and you can access it when drawing your own UI Panel.
I haven’t answered your original question, because as you hopefully can see now, what you want to do doesn’t really make sense for Blender. I hope my diatribe scared you enough to convince you that your youth (or whatever remains of it) is better spent on other things (such as sex and drugs) than this outlandish API. Consider yourself warned.
Also: If you want to write code examples, put them into “code” tags, so that the formatting isn’t lost.
Update: The above code examples don’t make the objects visible. For that, you need to link it to the scene, like this:
bpy.data.scene['Scene'].objects.link(my_ob)