[Tutor] Overriding a method in a class

Terry Carroll carroll at tjc.com
Sat May 14 01:41:06 CEST 2011


I have a pretty basic point of confusion that I'm hoping I can have 
explained to me.  I have a class in which I want to override a method, and 
have my method defined externally to the class definition invoked instead. 
But when I do so, my external method is invoked with a different argument 
signature than the method it overrides.

(I'll illustrate with a toy example named toy.py that maintains a list of 
strings; the actual use case is a wxPython drag-and-drop shell that I find 
I keep re-using over and over, so I decided to try to turn it into a 
general-purpose module for my own use.)

### example 1 begin

class Thing(object):
     def __init__(self):
         self.stuff = []
     def addstuff(self, text):
         self.add_the_stuff(text)
     def add_the_stuff(self, s1):
         self.stuff.append(s1)

A = Thing()
A.addstuff("ABCDEFG")
print A.stuff

### example 1 end

So far, this works as expected.  addstuff invokes add_the_stuff; and the 
line "print A.stuff" prints out as ['ABCDEFG'], as expected.

Now, here's where I am getting befuddled, with the following additional 
lines:

### example, continued
def addlower(self, s2):
     self.stuff.append(s2.lower()) # add it as lower case

B = Thing()
B.add_the_stuff=addlower
B.addstuff("WXYZ")
print B.stuff
### end

My *intent* here is to patch the Thing object named B so that the 
B's add_the_stuff method is replaced with this additional addlower method 
that I define external to the object.  My expectation would be that, just 
as add_the_stuff method was called with two arguments (self and the 
string), the patched-in addlower would also get called the same way.

What I *expect* is to see ['abcdefg'] printed.  What I get is:

Traceback (most recent call last):
   File "E:\Personal\py\DragDrop\toy.py", line 22, in <module>
     B.addstuff("WXYZ")
   File "E:\Personal\py\DragDrop\toy.py", line 7, in addstuff
     self.add_the_stuff(text)
TypeError: addlower() takes exactly 2 arguments (1 given)

I'm assuming I'm missing some fundamental concept.  What is it?


More information about the Tutor mailing list