Inheritance, Composition and Associated objects - when to use which - Python example
• Inheritance is where one object is based on another.
• Composition is where one object contains another.
Question: Which should I use?
Answer: Probably BOTH!
On yesterday's Python course, the question came up, and I wrote an illustrative answer - source code
[here]. The scenario we took was a restaurant.
We have tables of various shapes - rectangular ones, square ones, and circular ones. They're all based on a base class called
table as all tables, no matter what shape, have some properties in common. And then we inherit from that base class to give somewhat updated table subclasses for each shape adding in the extra logic to work out how many people can be seated without being on the corners.
We also have
persons - staff and customers - which have some features in common (such as names) but some differences in their other properties. Again, that's a case of inheritance.

The next step is to say that we have a member of staff responsible for each table, and multiple customers (perhaps) seated at each table. And that's where our composite / associated objects come into play. We don't want to add all the attributes of a staff member to a table - we just want to have a contained or associated object of type staff in our object of type table, and a list of objects of type customer in our object of type table.
The diagram, drawn using "class" and "object" tables in a UML-like way, shows these various relationships.
Update ... the course carried on the following day, and I added various static methods including a factory, comparators, and overrode the print method for some objects. The final source code is
[here].
(written 2012-10-10, updated 2012-10-13)
Associated topics are indexed under
Y116 - Python - Applying OO design techniques and best practise [4028] Really Simple Class and Inheritance example in Python - (2013-03-04)
[2604] Tips for writing a test program (Ruby / Python / Java) - (2010-01-29)
[2523] Plan your application before you start - (2009-12-02)
[2485] How do I set up a constant in Python? - (2009-10-31)
[2407] Testing code in Python - doctest, unittest and others - (2009-09-16)
[2363] Alpaca Case or Camel Case - (2009-08-16)
[1181] Good Programming practise - where to initialise variables - (2007-05-09)
[945] Code quality counts - (2006-11-26)
[836] Build on what you already have with OO - (2006-08-17)
[668] Python - block insets help with documentation - (2006-04-04)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[340] Code and code maintainance efficiency - (2005-06-08)
Y112 - Python - Objects - Intermediate [4094] Python Properties - how and why - (2013-05-18)
[3796] Backquote, backtic, str and repr in Python - conversion object to string - (2012-07-05)
[3524] Metaclasses (Python) and Metatables (Lua) - (2011-11-17)
[3472] Static variables in functions - and better ways using objects - (2011-10-10)
[3442] A demonstration of how many Python facilities work together - (2011-09-16)
[3002] A list of special method and attribute names in Python - (2010-10-17)
[2994] Python - some common questions answered in code examples - (2010-10-10)
[2905] Defining static methods in Python - (2010-08-05)
[2889] Should Python classes each be in their own file? - (2010-07-27)
[2785] The Light bulb moment when people see how Object Orientation works in real use - (2010-05-28)
[2764] Python decorators - your own, staticmethod and classmethod - (2010-05-14)
[2722] Mixins example in Python - (2010-04-14)
[2720] Multiple inheritance in Python - complete working example - (2010-04-14)
[2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
[2693] Methods that run on classes (static methods) in Python - (2010-03-25)
[2409] TypeError: super() argument 1 must be type, not classobj (Python) - (2009-09-18)
[2368] Python - fresh examples of all the fundamentals - (2009-08-20)
[1819] Calling base class constructors - (2008-10-03)
[1661] Equality, sameness and identity - Python - (2008-05-31)
[1644] Using a utility method to construct objects of different types - Python - (2008-05-17)
[1517] Python - formatting objects - (2008-01-24)
[1217] What are factory and singleton classes? - (2007-06-04)
[1146] __new__ v __init__ - python constructor alternatives? - (2007-04-14)
[964] Practical polymorphism in action - (2006-12-04)
[903] Pieces of Python - (2006-10-23)
[831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
[477] Class, static and unbound variables - (2005-10-25)
[383] Overloading of operators on standard objects in Python - (2005-07-19)
[296] Using a Python dictionary as a holder of object attributes - (2005-04-30)
Q907 - Object Orientation and General technical topics - Object Orientation: Design Techniques [3978] Teaching OO - how to avoid lots of window switching early on - (2013-01-17)
[3928] Storing your intermediate data - what format should you you choose? - (2012-11-20)
[3878] From Structured to Object Oriented Programming. - (2012-10-02)
[3844] Rooms ready for guests - each time, every time, thanks to good system design - (2012-08-20)
[3798] When you should use Object Orientation even in a short program - Python example - (2012-07-06)
[3763] Spike solutions and refactoring - a Python example - (2012-06-13)
[3760] Why you should use objects even for short data manipulation programs in Ruby - (2012-06-10)
[3607] Designing your application - using UML techniques - (2012-02-11)
[3454] Your PHP website - how to factor and refactor to reduce growing pains - (2011-09-24)
[3260] Ruby - a training example that puts many language elements together to demonstrate the whole - (2011-04-23)
[3085] Object Oriented Programming for Structured Programmers - conversion training - (2010-12-14)
[3063] Comments in and on Perl - a case for extreme OO programming - (2010-11-21)
[2977] What is a factory method and why use one? - Example in Ruby - (2010-09-30)
[2953] Turning an exercise into the real thing with extreme programming - (2010-09-11)
[2878] Program for reliability and efficiency - do not duplicate, but rather share and re-use - (2010-07-19)
[2865] Relationships between Java classes - inheritance, packaging and others - (2010-07-10)
[2747] Containment, Associative Objects, Inheritance, packages and modules - (2010-04-30)
[2741] What is a factory? - (2010-04-26)
[2501] Simples - (2009-11-12)
[2380] Object Oriented programming - a practical design example - (2009-08-27)
[2327] Planning! - (2009-08-08)
[2170] Designing a heirarcy of classes - getting inheritance right - (2009-05-11)
[2169] When should I use OO techniques? - (2009-05-11)
[1538] Teaching Object Oriented Java with Students and Ice Cream - (2008-02-12)
[1528] Object Oriented Tcl - (2008-02-02)
[1435] Object Oriented Programming in Perl - Course - (2007-11-18)
[1224] Object Relation Mapping (ORM) - (2007-06-09)
[1047] Maintainable code - some positive advice - (2007-01-21)
[747] The Fag Packet Design Methodology - (2006-06-06)
[534] Design - one name, one action - (2005-12-19)
[507] Introduction to Object Oriented Programming - (2005-11-27)
[236] Tapping in on resources - (2005-03-05)
[80] OO - real benefits - (2004-10-09)
56f6
Some other Articles
The components of an Apache httpd / Tomcat / MySQL stack and what each doesHere comes Santa - on the train from Melksham to Swindon on 2nd December 2012Melksham Chamber of Commerce - whence in 2013 and beyond?What a difference a year made - Melksham CampusInheritance, Composition and Associated objects - when to use which - Python exampleFormatting output - why we need to, and first Python exampleDefault local - a good choice by the author of PythonPictures - across the park, French Weir and River Tone, TauntonApple Pressing Day 2012Community Transport - Pewsey, Taunton, and the whole picture too