Should classes each be defined in a file of their own? In Java, unless you're making a use of inner classes, you're coerced into writing one class per file. In C++, you'll typically have the code for a class in one source file and the headers in another, as other schemes are impractical to use and maintain. But in many other languages - and the example I've chosen is Python - there's nothing stopping you defining multiple classes in the same file. You
can ... but
should you???
One of the big gains from using objects is that it allows you to compartmentalize your logic - putting everything that relates to a film into one class, and everything that relates to a cycle race in another. There's then no "leak" between the namespaces - no confusion when you say milkrace.getlength() or shrek3.getlength() as to which logic you're running. And there's the ability for you to have separate files, maintainance team and schedules for the various types of object / classes. But there is a bit of a "downer" it that it's pretty hard to work out what you can do with an object sometimes as it inherits through a web of classes that are based on other classes, picking up cascading code (bit like the problems with "where did THAT font come from" you may have if you're using CSS / Cascading style sheets)
Where you've got a group of classes which are (a) maintained by the same person, (b) maintained on the same schedule and (c) going to be used together ... then there's no good reason I can see that you should separate each of them out into a file of its own.
Go ahead and combine them!. The small gains you might make will be a consistency of naming with all classes being in files of the same name, but having them in separate files would lead to a needless layer of files. You have only to look at Java to realise what an issue this can be in the Java world, where the files are often bundled up into another structure called a jar file ...
I have put a complete class structure into a single file in an example
[here]. There are four classes with three layers of inheritance joining them - so they will naturally fall together into the same application (you
can't use a taxi without a travel ... which you
can't use without an event!).
If you want to find out what you can do on your object in Python, you can use the
dir function. Using the code example above, I decided to find out what methods I could use on a taxi ... and here's how I did it:
wizard:python graham$ python
Python 2.6.1 (r261:67515, Feb 11 2010, 15:47:53)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from teapot import *
>>> ap = taxi("Seend","13:15",5)
>>> dir(ap)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'celebrate', 'destiny', 'getcapacity', 'getdestiny', 'gettime', 'seats', 'time']
>>> ^D
wizard:python graham$
To do a similar thing in Java, use the
javap utility with the class file in which the object type you wish to examine available in your class path:
wizard:java graham$ javap gowdie/Isobel
Compiled from "Isobel.java"
public class gowdie.Isobel extends java.lang.Object{
float age;
float factor;
public java.lang.String name;
static int nanimals;
public gowdie.Isobel(int, int);
public gowdie.Isobel(java.lang.String, int, int);
public gowdie.Isobel(java.lang.String, int);
public float getEffAge();
public static int getCount();
static {};
}
wizard:java graham$
(See
[here] for more about Isobel Gowdie!)
(written 2010-07-27, updated 2010-07-30)
2d14
Associated topics are indexed under
Y112 - Python - Objects - Intermediate [4094] Python Properties - how and why - (2013-05-18)
[4028] Really Simple Class and Inheritance example in Python - (2013-03-04)
[3887] Inheritance, Composition and Associated objects - when to use which - Python example - (2012-10-10)
[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)
[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)
[2485] How do I set up a constant in Python? - (2009-10-31)
[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)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[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)
[2523] Plan your application before you start - (2009-12-02)
[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)
[836] Build on what you already have with OO - (2006-08-17)
[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)
56b4
Some other Articles
Exclamation marks and question marks on ruby method namesAlternative loops and conditionals in Ruby and PerlWiltshire Council ask how they can help businessesDates and times in PythonShould Python classes each be in their own file?Recent PicturesSnow Leopard and Python (that is OS X 10.6 and wxPython)Congratulations, KimberlyTwenty QuestionsHotlinked images onto adult material sites