Creating Class Objects in Loop

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Mon Mar 31 01:36:53 CEST 2008


En Sun, 30 Mar 2008 19:59:14 -0300, Fish <abbas4u at gmail.com> escribió:

> Hello Folks,
> I am reading a CSV file and based on that I am creating TestCase(my
> own defined class) objects in a for loop. The problem is each time I
> create a new TestCase object in loop, previous objects data is already
> copied in that object.

See this FAQ entry:  
http://www.python.org/doc/faq/general/#why-are-default-values-shared-between-objects

> ======= Problem Code
>
> The function snippet reading CSV and creating TestCase objects is
> [code]
> tcLst = []
> # CSV file is read in variable 'lines'

Try to use the standard csv module instead; it's fairly easy.

> def returnTcLst(path):
>   fp = open(path)
>   lines = fp.readlines()
>   for line in lines:

Instead of those two lines, you could use:

     for line in fp:

(readlines() has to read the whole file into memory; files are their own  
line iterators)

> 	tc.setPcap(line[:i].strip())

getters/setters are not usually used in Python because they offer no  
advantage over directly using an attribute:

         tc.pcap = line[:i].strip()

> 	tcLst.append(tc)
> 	del tc

Why "del tc"?
That doesn't invoke the destructor, just removes the name "tc" from the  
local namespace. (The object tc refers to isn't destroyed yet because it  
has at least one reference: it's contained in the tcLst list)

> class TestCase(object):
> 	def __init__(self, pcap = None, sids = []):
> 		self.__Pcap = pcap
> 		self.__lstSid = sids

As you can see in the FAQ entry, the common idiom is to write:

  	def __init__(self, pcap = None, sids = None):
                 if sids is None:
                     sids = []
  		self.Pcap = pcap
  		self._lstSid = sids

Note that I've changed the __names; use __ when you expect a name  
collision with a subclass.
For "implementation only" attributes, use a single underscore; based on  
your appendSid method, lstSid looks like it's used in this way.

> 	def setPcap(self, path):
> 		self.__Pcap = path

This method isn't necesary anymore.

> 	def appendSid(self, sid):
> 	def __str__(self):

Should be changed accordingly.

-- 
Gabriel Genellina




More information about the Python-list mailing list