The trick is to remember to upcall to Actor.init() when you override init().
This is one of those Python quirks that trips everyone up. Unlike C++, Python does not automatically generate upcalls to the constructor when you define a new constructor. So if you redefine init(), you are completely replacing the Actor’s own constructor, and unless you remember to upcall, the Actor will not get properly constructed.
I now get a different error when I type the code drwr gave me.
D:\Thertor>ppython main.py
DirectStart: Starting the game.
Warning: DirectNotify: category 'Interval' already exists
Known pipe types:
wglGraphicsPipe
(3 aux display modules not yet loaded.)
:display:gsg:glgsg(warning): BlendEquation advertised as supported by OpenGL run
time, but could not get pointers to extension function.
:display:gsg:glgsg(warning): BlendColor advertised as supported by OpenGL runtim
e, but could not get pointers to extension function.
:util(warning): Adjusting global clock's real time by 0.131903 seconds.
:loader(error): Couldn't load file Body: not found on model path (which is curre
ntly: ".;/c/Panda3D-1.3.0/etc/..;/c/Panda3D-1.3.0/etc/../models")
:loader(error): Couldn't load file Jaw: not found on model path (which is curren
tly: ".;/c/Panda3D-1.3.0/etc/..;/c/Panda3D-1.3.0/etc/../models")
:loader(error): Couldn't load file Tail: not found on model path (which is curre
ntly: ".;/c/Panda3D-1.3.0/etc/..;/c/Panda3D-1.3.0/etc/../models")
Traceback (most recent call last):
File "main.py", line 71, in ?
Hound = Player()
File "main.py", line 22, in __init__
self.loadModel({ "Jaw":"plainshoundJaw.egg",
File "C:\Panda3D-1.3.0\direct\src\actor\Actor.py", line 1360, in loadModel
bundle = model.find("**/+PartBundleNode")
AttributeError: 'list' object has no attribute 'find'
Or, now that you are calling the Actor constructor, you can alternatively pass your dictionary up to that (since the constructor will take a dictionary):