Question
In Programming Python, Mark Lutz mentions the term mixin. I am from a C/C++/C# background and I have not heard the term before. What is a mixin?
Reading between the lines of [this example](http://books.google.com/books?id=5zYVUIl7F0QC&pg=RA1-PA584&lpg=RA1-PA584&dq=programming+python+guimixin&source=bl&ots=HU833giXzH&sig=jwLpxSp4m_VbOYQ897UDkGNx_2U&hl=en&ei=x8iRSaTTF5iq- ganpbGPCw&sa=X&oi=book_result&resnum=3&ct=result) (which I have linked to because it is quite long), I am presuming it is a case of using multiple inheritance to extend a class as opposed to proper subclassing. Is this right?
Why would I want to do that rather than put the new functionality into a subclass? For that matter, why would a mixin/multiple inheritance approach be better than using composition?
What separates a mixin from multiple inheritance? Is it just a matter of semantics?
Answer
A mixin is a special kind of multiple inheritance. There are two main situations where mixins are used:
- You want to provide a lot of optional features for a class.
- You want to use one particular feature in a lot of different classes.
For an example of number one, consider werkzeug's request and response system. I can make a plain old request object by saying:
from werkzeug import BaseRequest
class Request(BaseRequest):
pass
If I want to add accept header support, I would make that
from werkzeug import BaseRequest, AcceptMixin
class Request(AcceptMixin, BaseRequest):
pass
If I wanted to make a request object that supports accept headers, etags, authentication, and user agent support, I could do this:
from werkzeug import BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin
class Request(AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin, BaseRequest):
pass
The difference is subtle, but in the above examples, the mixin classes weren't
made to stand on their own. In more traditional multiple inheritance, the
AuthenticationMixin
(for example) would probably be something more like
Authenticator
. That is, the class would probably be designed to stand on its
own.