On 02/17/2012 09:06 AM, leam hall wrote:
On 2/17/12, Dave Angel<d...@davea.name>  wrote:

Real question is whether some (seldom all) of those variables are in
fact part of a larger concept.  If so, it makes sense to define a class
for them, and pass around objects of that class.  Notice it's not
global, it's still passed as an argument.  This can reduce your
parameters from 20 to maybe 6.  But make sure that the things the class
represents are really related.

Dictionaries are a built-in collection class, as are lists, sets, and
tuples.  But you can write your own.  An example of needing a class
might be to hold the coordinates of a point in space.  You make a
Location class, instantiate it with three arguments, and use that
instance for functions like
     move_ship(ship, newlocation)

DaveA
Understood. In this case, the first half dozen variables are input and
the rest are derived from the first ones. A class might make sense and
though I understand them a little, not enough to make a good judgement
on it.

The task is to take parameters for a scuba dive; depth, gas mix, time,
air consumption rate, and compute the O2 load, gas required, etc.

Leam

There are two ways to think of a class. One is to hold various related data, and the other is to do operations on that data. If you just consider the first, then you could use a class like a dictionary whose keys are fixed (known at "compile time").

class MyDiver(object):
    def __init__(self, depth, gasmix, time, rate):
        self.depth = int(depth)
        self.gasmix = int(gasmix)
        self.time = datetime.datetime(time)
        self.rate  = float(rate)



Now if you want to use one such:

    sam = MyDiver(200, 20, "04/14/2011",  "3.7")
    bill = MyDiver(.....)

And if you want to fetch various items, you'd do something like:
   if sam.depth < bill.depth

instead of using   sam["depth"]  and bill["depth"]

Next thing is to decide if the functions you're describing are really just methods on the class

class MyDiver(object):
    def __init__( ... as before)


    def get_load(self):
        return self.gasmix/self.rate            (or whatever)

and used as     print sam.get_load()

that last could be simplified with a decorator

    @property
    def load(self):
        return self.gasmix/self.rate

now it's used as though it's a regular data attribute

    print sam.load



--

DaveA

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to