[Tutor] dict vs several variables?

Dave Angel d at davea.name
Fri Feb 17 15:26:43 CET 2012


On 02/17/2012 09:06 AM, leam hall wrote:
> On 2/17/12, Dave Angel<d at 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



More information about the Tutor mailing list