import collections import logging logging.basicConfig(level='INFO') def super_isinstance(super_inst, cls): 'Is the cls in the mro after the current class?' mro = super_inst.__self__.__class__.__mro__ thisclass = super_inst.__thisclass__ return cls in mro and mro.index(thisclass) < mro.index(cls) class LoggingDict(dict): # Simple example of extending a builtin class def __setitem__(self, key, value): logging.info('Setting %r to %r' % (key, value)) next_in_mro = super(LoggingDict, self) next_in_mro.__setitem__(key, value) # Show diagnostics print(self.__class__) print(super_isinstance(next_in_mro, dict)) print(super_isinstance(next_in_mro, collections.OrderedDict)) print(super_isinstance(next_in_mro, LoggingDict)) print(super_isinstance(next_in_mro, LoggingOD)) print() class LoggingOD(LoggingDict, collections.OrderedDict): # Build new functionality by reordering the MRO pass if __name__ == '__main__' ld = LoggingDict([('red', 1), ('green', 2), ('blue', 3)]) print(ld) # unordered ld['red'] = 10 ld = LoggingOD([('red', 1), ('green', 2), ('blue', 3)]) print(ld) # ordered ld['red'] = 10 print('-' * 20)