best way to get data into a new instance?
James Stroud
jstroud at mbi.ucla.edu
Thu Sep 28 17:12:06 EDT 2006
James Stroud wrote:
> John Salerno wrote:
>
>> Let's pretend I'm creating an Employee class, which I will later
>> subclass for more specific jobs. Each instance will have stuff like a
>> name, title, degrees held, etc. etc.
>>
>> So I'm wondering, is the best way to get all this information into the
>> object to just have a really long __init__ method that takes each
>> argument?
>>
>> Does a question like this depend on how the class will be used? I'm
>> trying to construct it in a way that is independent of, say, the GUI
>> interface that will be used, but I can't help but think that if all
>> the data is entered into a GUI, then passed programmatically to the
>> class, then it's no big deal because it happens behind the scenes. But
>> if, for instance, someone manually created a new instance, they would
>> have a ton of arguments to type in each time. Granted, even with the
>> GUI they are basically typing in arguments, but in the manual case
>> you'd have to type in the call to the class, the parentheses, commas,
>> quotes around the strings, etc. (But still, I'm trying not to let a
>> specific interface influence the construction of what should probably
>> be a completely independent class implementation.)
>>
>> Thanks.
>
>
> This assumes that someone will hard-code an instance of your Employee.
> E.g.:
>
> e = Employee(Last, First, ID,
> private_medical_info = 'Has halitosis.')
>
> Will this ever really happen--either by an API user or an end user?
> Probably not for a database of any usefulness at all. Usually records
> will be programatically created (or created through a gui), so it really
> isn't necessary to worry about this case, except maybe for testing. This
> has been my experience. Its probably better to init with the bare
> minimum parameters and focus on how to move information from an external
> source into an already created instance:
>
> e = Employee(Last, First, ID)
> e.private_medical_info = 'Has halitosis.'
>
> If you are worried about validating field names, maybe use a method:
>
> class Employee(object):
> def __init__(self, Last, First, ID, **kwargs):
> self.Last = Last
> self.First = First
> self.ID = ID
> self._fields = {'Last':'Last Name',
> 'First':'First Name',
> 'ID':'Employee Identification Number',
> 'private_medical_info':'Any source of bad odor.'}
> for (field, value) in kwargs.items():
> self.set_value(field, value)
> def set_value(field, value):
> if not field in self._fields:
> raise ValueError, 'Field "%s" not supported.' % field
> else:
> self.__setattr__(field, value)
> def get_value(field):
> if not field in self._fields:
> raise ValueError, 'Field "%s" not supported.' % field
> else:
> self.__getattribute__(field)
>
>
> OK, I'll stop. You get the idea.
>
> You will find dealing with external sources the more interesting problem
> anyway.
>
> James
>
>
should be
def set_value(self, field, value):
and
def get_value(self, field):
James
--
James Stroud
UCLA-DOE Institute for Genomics and Proteomics
Box 951570
Los Angeles, CA 90095
http://www.jamesstroud.com/
More information about the Python-list
mailing list