Putting aside whether the use of isinstance is harmful, I have run into the following conundrum when trying to evaluate isinstance after serializing/deserializing an object via Pickle:
from __future__ import with_statement import pickle # Simple class definition class myclass(object): def __init__(self, data): self.data = data # Create an instance of the class x = myclass(100) # Pickle the instance to a file with open('c:\\pickletest.dat', 'wb') as f: pickle.dump(x, f) # Replace class with exact same definition class myclass(object): def __init__(self, data): self.data = data # Read an object from the pickled file with open('c:\\pickletest.dat', 'rb') as f: x2 = pickle.load(f) # The class names appear to match print x.__class__ print x2.__class__ # Uh oh, this fails...(why?) assert isinstance(x2, x.__class__)
Can anyone shed some light on why isinstance would fail in this situation? In other words, why does Python think these objects are of two different classes? When I remove the second class definition, isinstance works fine.
This is how the unpickler works (site-packages/pickle.py):
To find and instantiate a class.
So of course if you replace a class with an identically named class, the
klass = getattr(mod, name)will return the new class, and the instance will be of the new class, and so isinstance will fail.