4540l4.txt

Listing 4. Our Final Version of Mix-in

import types


def MixIn(pyClass, mixInClass, makeAncestor=0):
    if makeAncestor:
        if mixInClass not in pyClass.__bases__:
            pyClass.__bases__ = (mixInClass,) + pyClass.__bases__
    else:
        # Recursively traverse the mix-in ancestor classes in order
        # to support inheritance
        baseClasses = list(mixInClass.__bases__)
        baseClasses.reverse()
        for baseClass in baseClasses:
            MixIn(pyClass, baseClass)

        # Install the mix-in methods into the class
        for name in dir(mixInClass):
            if not name.startswith('__'): # skip private members
                   member = getattr(mixInClass, name)
                   if type(member) is types.MethodType:
                        member = member.im_func
                   setattr(pyClass, name, member)

