# ***if*** File _was_ a class...: class UppercaseFile(File): # we could just override what we need to: def write(self, astring): return File.write(self, astring.upper()) def writelines(self, strings): return File.writelines(self, map(string.upper,strings)) # ...arranging for an upperOpen(...) might not be quite trivial... # but, File _isn't_ a class, so...: class UppercaseFile: # initialization is explicit def __init__(self, file): # not self.file=file, to avoid triggering __setattr__ self.__dict__['file'] = file # 'overrides' aren't very different: def write(self, astring): return self.file.write(self, astring.upper()) def writelines(self, strings): return self.file.writelines(self, map(string.upper,strings)) # automatic delegation isn't too difficult, either: def __getattr__(self, attr): return getattr(self.file, attr) def __setattr__(self, attr, value): return setattr(self.file, attr, value) # ...and upperOpen(whatever) is trivial indeed: def upperOpen(*args): return UppercaseFile(open(*args))