[Tutor] TypeError in base class __init__ after reload

Kent Johnson kent37 at tds.net
Thu Jan 24 14:51:38 CET 2008


Oops, sending to the list with this PS:
Google 'python reload' for discussion and workarounds.

Daniel Knierim wrote:
> Hello Pythonistas,
> 
> Running the script 'instantiate_and_reload.py' gives me the error 
>     TypeError: unbound method __init__() must be called with ParentClass instance as first argument (got ChildClass instance instead)

I haven't looked at your script closely enough to know exactly where the
  error is but there are some real problems with reloading modules when
you have references to objects in the module object. The module is
reloaded but the references are not automatically rebound to the new
module. In particular, names that are imported from the module will
still refer to the original module, and instances of classes from the
module will refer (via their __class__ attribute) to the original class.

The docs for reload() talk about this a little:
http://docs.python.org/lib/built-in-funcs.html#l2h-61

For example (using the cmd module just because it contains a class):
In [1]: from cmd import Cmd

Cmd is bound to the class object in the cmd module
In [2]: c=Cmd()

c is an instance of the original class

In [3]: import cmd
In [4]: cmd.Cmd is Cmd
Out[4]: True
In [5]: isinstance(c, cmd.Cmd)
Out[5]: True

cmd.Cmd, Cmd and c.__class__ all refer to the same class

In [6]: reload(cmd)
Out[6]: <module 'cmd' from
'/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/cmd.pyc'>
In [7]: isinstance(c, cmd.Cmd)
Out[7]: False

We now have a new class object bound to cmd.Cmd, it is not the same object!

In [8]: from cmd import Cmd
In [9]: c.__class__
Out[9]: <class cmd.Cmd at 0x10ac870>
In [10]: c.__class__ is Cmd
Out[10]: False

c.__class__ is still the old Cmd class

In [11]: Cmd is cmd.Cmd
Out[11]: True
In [12]: reload(cmd)
Out[12]: <module 'cmd' from
'/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/cmd.pyc'>
In [13]: Cmd is cmd.Cmd
Out[13]: False

Cmd itself has the same trouble.

Kent



More information about the Tutor mailing list