July 2002
Intermediate to advanced
608 pages
15h 46m
English
Credit: Alex Martelli
You’d like to inherit from a built-in type, but you are using Python 2.1 (or earlier), or need a semantic detail of classic classes that would be lost by inheriting from a built-in type in Python 2.2.
With Python 2.2, we can inherit directly from a built-in type. For
example, we can subclass file with our own
new-style class and override some methods:
class UppercaseFile(file):
def write(self, astring):
return file.write(self, astring.upper( ))
def writelines(self, strings):
return file.writelines(self, map(string.upper,strings))
upperOpen = UppercaseFileTo open such a file, we can call
upperOpen
just like a function, with the same arguments as the built-in
open function. Because we don’t
override _ _init_ _, we inherit
file’s arguments, which are the
same as open’s.
If we are using Python 2.1 or earlier, or if we need a classic class for whatever purpose, we can use automatic delegation:
class UppercaseFile:
# Initialization needs to be explicit
def _ _init_ _(self, file):
# NOT self.file=file, to avoid triggering _ _setattr_ _
self._ _dict_ _['file'] = file # Overrides aren't very different from the inheritance case: def write(self, astring): return self.file.write(astring.upper( )) def writelines(self, strings): return self.file.writelines(map(string.upper,strings)) # Automatic delegation is a simple and short boilerplate: def _ _getattr_ _(self, attr): return getattr(self.file, attr) ...