-- Chris Siebenmann
- Creating inheritance hierarchies for exceptions so I can have hierarchies of general and specific exceptions. I'm pretty sure that I'm usually over-designing when I do this and that I rarely need an actual hierarchy as opposed to one or two separate exceptions.
- As data records, ie the equivalent of C structs, in situations where just a list or a dictionary isn't enough. This 'bag of data' design pattern probably horrifies real OO people.
- For polymorphism, when I have generic operations to apply to a variety of underlying object types. Usually I don't use much or any inheritance for this, because in Python you don't need to use inheritance to get polymorphism; you can just duck type. (This is a superset of objects as data records.)
- For combining data and behavior together when it seems to make things simpler. My ideal is when all of the code that has to know about internal data storage details can be most conveniently put in one place (ie on the class), but I am willing to put methods on the side of a bag of data when it makes dealing with the data simpler. (Sometimes this involves polymorphism.)
Chris points out that this is not a complete list, but rather a list of the ones he uses most often. Are there any other ways that you use Python objects that are unconventional? Please share them in the comments section below.