OOP design of code representing units of measurement
raise TypeError, "Units derived from %s and %s are incompatible." % (self.base_unit)


The python style guide recommends raising exceptions in the raise TypeError(message) form. TypeError is also questionable as the correct exception to throw here. The error here doesn't seem to be quite the same as making inappropriate use of python types. I'd have a UnitError class.

def __repr__(self):            
     return "%s (%s)" % (self.name, self.suffix)


__repr__ is supposed to return either a valid python expression or something of the form &lt;text&gt;

base = BaseUnit("Cubic metres", "m3") 


I'd make a global cubic meter object

My overall thought is: do you really need this? My inclination would be to convert all data to  the correct units as I read it. That way all data in my program would be using consistent units and I wouldn't have to worry about whether data is in some other exotic unit. Of course, depending on your exact scenario, that may not be a reasonable approach.