Maarten van Reeuwijk wrote:
Thank you emmanuel for asking this question, I was wondering exactly the
same thing. Is it also possible to override the reload method to make it
(besides reloading) to scan through all namespaces for objects of class
toto.toto and replace their methods automatically? What would that code
look like?
In general, it is impossible or atleast very inefficient to do that.
It may be easiest if toto.toto would prepare itself for reloading:
import weakref
try:
weakref.totos
except AttributeError:
weakref.totos = []
class toto:
def __init__(self, args):
weakref.totos.append(weakref.ref(self))
...
def update_totos():
for t in weakref.totos:
t = t()
if t: t.__class__ = toto
def shrink_totos():
totos = []
for t in weakref.totos:
if t(): totos.append(t)
weakref.totos=[]
Then, after reloading toto, invoke toto.update_totos(). From
time to time, invoke weakref.shrink_totos(), to discard unused
weak references.
If you absolutely want to update all objects without preparing
a list earlier, you can use gc.get_objects() to find all containers;
you need to find out which of those are totos. Don't compare the
classes of the objects for identity (o.__class__ is toto.toto), unless
you have a reference of the old class (i.e. before reloading).
Regards,
Martin