Help please: How to assign an object name at runtime
John Machin
sjmachin at lexicon.net
Wed Jun 29 22:45:06 EDT 2005
c0chong at gmail.com wrote:
> Good day:
> Probably the answer to my question is staring me in the face, but the
> solution escapes me.
>
> The following is the input line of the file: SoftDict-.csv:
> ca1017,GRPHScriptSet,ADD/REM,Adobe Acrobat 4.0=2005/06/14
>
> I expected an instance of Machine() to be created with a name ca1017.
There is absolutely no basis at all for this expectation. How did you
arrive at it?
>
> Instead, an object is assigned to l[0] named:
> <__main__.Machine instance at 0x01282558>
The object is assigned to l[0] exactly as you dictated, i.e. its name is
l[0]. The former referent of l[0] i.e. the string whose value is
"ca1017" is no longer in view and will be garbage-collected.
What are you really wanting to do?
BTW, don't use "l".
>
> -----------------------------
> Here is my code:
>
> class Machine:
> def __init__(self):
> self.software = []# Holds attributes of the instance
Do you mean like self.software ultimately =
['GRPHScriptSet', 'ADD/REM', 'Adobe Acrobat 4.0=2005/06/14'] ?
That's not quite what the man meant when he said 'object-oriented'!!
> def add(self, sware):
> self.software.append(sware)# Append attribute
> return self.software
> def show(self):
> return self.software
> def __call__(self):
> return [ e for e in self.software]
Isn't that the same as "return self.software"?
So obj.show() and obj() return an attribute of obj? That's an
"interesting" interface.
Lose the __call__ -- you don't need it.
> def cnt(self):
> return '%s' % (len(self.software))
Why not just return the length as an integer???
> def installed(self, sware):
> if sware in self.software:
> return True
> else:
> return False
Try "return sware in self.software"
>
> class FileList:
> def __init__(self, filename):
> self.file = open(filename, 'r') # open and save file
> def __getitem__(self, i): # overload indexing
> line = self.file.readline()
> if line:
> return line # return the next line
> else:
> raise IndexError # end 'for' loops, 'in'
> def __getattr__(self, name):
> return getattr(self.file, name) # other attrs
>
>
> if __name__ == '__main__':
>
> import sys, fileinput, os, string # when run, not imported
>
> for line in FileList('SoftDict-.csv'): # Treat .csv as a text
> if len(line)==1: break # Quit processing; end of file
> l=line.split(',')# Split the line into constituent parts
> l[0]=Machine() # Create a Machine() object named: ca1017
> -------------------------------------------
>
> That's it. I evidently have no idea what I am doing.
The whole FileList class is pointless. Step 1: replace """for line in
FileList(filename):"""
with """for line in open(filename):"""
and lose the """if .... : break""" line.
Step 2: read up on the csv module, and lose the "split".
Step 3: you are unlikely to *ever* need the string and fileinput modules
Step 4: you import 4 modules you don't use. Why?
Oh and BTW Step 0: what are the requirements for this exercise, what do
the fields in the file actually represent, what is that bloody = sign
between 'Adobe Acrobat' and the date aaaarrrggghhhh words fail me [finally]
... exiting in pursuit of paracetamol,
John
More information about the Python-list
mailing list