best way to get data into a new instance?
James Stroud
jstroud at mbi.ucla.edu
Thu Sep 28 17:08:15 EDT 2006
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
--
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