OO design

Caleb Hattingh caleb1 at telkomsa.net
Tue Jul 19 23:23:06 CEST 2005


Chris

> 1. get arbitrary numerical data (typically large data sets in columnar
> format or even via COM from other packages. I generally have to deal with
> one or more sets of X,Y data)
> 2. manipulate the data (scaling, least squares fitting, means, peaks,
> add/subtract one XY set from another etc)
> 3. plot data (original set, results of manipulation, scatterplot,  
> histograms
> etc  - I use matplotlib)

Matplotlib is really coming on.  I still use gnuplot out of familiarity  
(and features, to be sure) but one of these days I'm going to spend a bit  
of time on Matplotlib.

> 4. export data (print, csv, shelve)

I do very much the same kind of work with python.  I write mostly in  
Delphi at work, but for processing stuff like this, I always use python  
when the dataset is not too big and the processing of the data is not too  
expensive.  Despite the awesome Delphi IDE, python with a text editor is  
*still* more productive (for *me*) in jobs like this.

> I have no problem writing bits of functional code to do any of the above.
> But for the life of me I can't see how I can hook them altogether in an  
> OO
> based framework that I can build and extend (with more data formats,
> manipulations, GUI etc).

To be honest, I am probably a poor source of advice here because I think I  
tend to overuse the class paradigm when often a more sensible approach  
would be a top-down strategy.   I just tend to think in terms of objects,  
for better or worse.  At least python's class declarations are not  
expensive in terms of setting up, so I tell myself it's ok.

Lets look at what you suggested:

> class XY:
>   def read_file
>   def scale_data
>   def plot_data
>   def shelve_data

This is exactly the kind of thing I do as well, but maybe separate the  
dataset from the processing (and put the classes into separate files, if  
you prefer - I find the "one class per file" idea easier to manage in my  
editor , Vim)

class XYpoint(object):
	def __init__(self,x=0,y=0):
		self.x = x
		self.y = y

class Dataset(object):
	def __init__(self):
		self.data = [] # Will be a list of XYpoint objects - probably filled in  
with Gather?
	def Gather(self,source):
		pass # You fill this in, using source as you prefer
	def Scale(self,factorX,factorY): # Filled out with example implementation  
below
		for i in range(len(self.data)):
			self.data[i].x = self.data[i].x * factorX
			self.data[i].y = self.data[i].y * factorY
	def Plot(self):
		pass # Do what you gotta do
	def Shelve(self):
		pass # Do what you gotta do

class MultipleDatasets(object):
	def __init__(self):
		self.datasets = [] # Will be a list of dataset objects, which you must  
populate
	def PlotAll(self):
		for i in self.datasets:
			i.Plot # How to plot all your datasets, for example

[FWIW - This is how I write all my python programs - very very naively and  
simply.  I just cannot remember all the fancy things enough to use when I  
need to get something done.  This is the kind of simple syntax that lured  
me to python in the first place, and I have a disconcerting feeling about  
all the "advanced" features for "master" programmers creeping into the  
language lately, or at least getting discussed - I don't think I am smart  
enough to absorb it all - CS isn't my area]

> But somehow that doesn't feel right, especially when I expect the number  
> of
> methods will grow and grow, which would make the class very unwieldy.

I would be interested to know if you think what I wrote "feels" right to  
you or not - It certainly feels "right" to me, but then that is hardly  
surprising.  In any case, what I presented almost exactly fits how I  
"think" about the problem, and that is what I want.

> bwaha.

?

regards
Caleb







More information about the Python-list mailing list