On 03/05/2012 03:16 PM, Albert-Jan Roskam wrote:
Hi,

I am extending a program for a hobby project where potentially huge spss files 
are read. I would like to add functionality to append files. I thought it would 
be nice and intuitive to overload + and += for this. The code below is a gross 
simplification, but I want to get the basics right. Is this the way how 
operator overloading is usually done?


class Append(object):

     def __init__(self, file1, file2=None):
         """ file1 and file2 will actually be of a class of my own,
         which has a readFile method that is a generator that returns
         one record at a time """
         self.file1 = file1
         self.file2 = file2
         self.merged = []

     def __add__(self):
         self.file1.extend(self.file2)
         return self.file1

     def __iadd__(self):
         self.merged.extend(self.file1)
         return self.merged
def writerows(self):
         rows = self.file1
         for row in rows:
             yield row

# overloading '+'
file1 = [[1, 2, 3], [4, 5, 6], [6, 6, 6]] file2 = [[1, 2, 3]]
app = Append(file1, file2)
merged = app.file1 + app.file2 # 'merged'  will not actually hold data
for line in app.writerows():
     print line

# overloading '+='
files = [file1, file2]
for i, f in enumerate(files):
     if i == 0:
         app = Append(f)
         app.merged = f
     else:
         app.merged += f
print app.merged


I hate to say it, but it's not even close.

When you say app.file1 + app.file2, you're not calling either of your special methods you defined in Append. You're just adding the file1 and file2 attributes. Since in your example these are lists, they do the usual thing.

Similarly, your app.merged += f  does NOT call your __iadd__() method.

Just what kind of an object is an Append object supposed to be? Classes are usually for encapsulating data and behavior, not just to bundle up some functions.

Normally, you should be defining the __add__() and __iadd__() methods in the 
class that file1 and file2 are instances of.  So if you want to make a dummy 
example, start by defining a (single) class that holds just one of these.  Then 
create two instances, and try adding and +='ing the two instances.



DaveA


--

DaveA

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to