Mixin classes and single/multiple inheritance

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Thu Sep 20 11:25:04 CEST 2007

On Thu, 20 Sep 2007 14:52:50 +1000, Ben Finney wrote:

> Can you give a code example of how you think mixins should be
> implemented in Python, assuming the absence of multiple inheritance?

I'll take a shot at it... use automatic delegation to the mixin class.

class Parrot(object):
    def fly(self):
        return "The parrot can fly short distances."
    def talk(self):
        return "I'm pining for the fjords."

class Albatross(object):
    def fly(self):
        return "The albatross is known to fly enormous distances."

# Now I want a talking Albatross, without using multiple inheritance.

class TalkingAlbatross(Albatross):
    def __init__(self, *args, **kwargs):
        # avoid triggering __setargs__
        self.__dict__['mixin'] = Parrot()
        # avoid using super() so Ben doesn't get cranky
        self.__class__.__base__.__init__(self, *args, **kwargs)
    def __getattr__(self, name):
        return getattr(self.mixin, name)
    def __hasattr__(self, name):
        return hasattr(self.mixin, name)
    def __delattr__(self, name):
        return delattr(self.mixin, name)
    def __setattr__(self, name, value):
        return setattr(self.mixin, name, value)

Am I close?


More information about the Python-list mailing list