I'm working on a "TempFile" class that stores the data in memory until it gets larger than a specified threshold (as per PEP 42). Whilst trying to implement it, I've come across some strange behaviour. Can anyone explain this?
The test case at the bottom starts a TempFile at size 50 and prints its type. It then increases the size to the threshold at which point "self" is changed to being a TemporaryFile. It seems that the next call correctly uses the write() method of TemporaryFile (since we don't see "changing type" in the output). However, type(tmp) still equals TempFile. Not only that, tmp can still access the method dummy() that exists only in TempFile. #!/usr/bin/env python from StringIO import StringIO import tempfile class TempFile(StringIO, object): """A temporary file implementation that uses memory unless either capacity is breached or fileno is requested, at which point a real temporary file will be created and the relevant details returned """ def __init__(self, buffer, capacity): """Creates a TempFile object containing the specified buffer. If capacity is specified, we use a real temporary file once the file gets larger than that size. Otherwise, the data is stored in memory. """ self.capacity = capacity if len(buffer) > capacity: self = tempfile.TemporaryFile() self.write(buffer) else: super(TempFile, self).__init__(buffer) def dummy(self): pass def write(self, str): self.seek(0, 2) # find end of file if((self.tell() + len(str)) >= self.capacity): print "changing type" flo = tempfile.TemporaryFile() flo.write(self.getvalue()) self = flo print type(self) else: super(TempFile, self).write(str) print "testing tempfile:" tmp = TempFile("", 100) ten_chars = "1234567890" tmp.write(ten_chars * 5) tmp.dummy() print "tmp < 100: " + str(type(tmp)) tmp.write(ten_chars * 5) tmp.dummy() print "tmp == 100: " + str(type(tmp)) tmp.write("the last straw") tmp.dummy() print "tmp > 100: " + str(type(tmp)) -- http://mail.python.org/mailman/listinfo/python-list