Recursion problem
Dennis Peterson
denpeterson at yahoo.com
Sun May 19 10:10:53 EDT 2002
Thanks for the help, John, I'll follow your advice. All the oop I've done
until now was C++, which has no class-level data, and thinking in those
terms made this seem very strange.
-Dennis
"John Machin" <sjmachin at lexicon.net> wrote in message
news:c76ff6fc.0205190444.204fd65e at posting.google.com...
> "Dennis Peterson" <denpeterson at yahoo.com> wrote in message
news:<ac7d2u02vgg at enews2.newsguy.com>...
> > I'm trying to implement a basic Composite pattern. In the following
code, I
> > expect c.getData() and d.getData() to both return "hellogoodbye".
Instead,
> > on d.getData() I get stacktrace printing "y += i.getData()" repeatedly
until
> > recursion depth exceeded. Why?
> >
> > I'm new to Python, running latest Windows version just downloaded.
> >
> > class Simple:
> > def __init__(self,x):
> > self.data = x
> > def getData(self):
> > return self.data
> >
> > class Compound:
> > data = []
>
> This "data" is a *CLASS*-level attribute, shared by all instances of
> the class.
> You should have an __init__() similar to the other class, to set
> self.data to [].
>
> > def getData(self):
> > y = ""
> > for i in self.data:
> > y += i.getData()
> > return y
> >
> > def test():
> > a = Simple("hello")
> > b = Simple("goodbye")
> > c = Compound()
> > c.data.append(a)
> > c.data.append(b)
>
> Insert a print statement here ... print c.data
> > print c.getData()
> > d = Compound()
> > d.data.append(c)
>
> Now for the big surprise:
> print d.data
> *AND*
> print c.data
> Just like the man said, c.data and d.data are the same thing ... and
> uh-oh, that means c contains a reference to itself!
> > print d.getData()
>
> d contains c, which contains c, so you start emulating the mythical
> ooloo bird, until saved by the recursion limit.
>
> *HINT* Unless you expect your code to work correctly first time or if
> not that kind strangers will always do your debugging for you, learn
> to put in print statements to give yourself a bit of a clue as to what
> is going wrong. You seem to have jumped right in to the OO aspects of
> Puthon; perhaps you might like to write yourself a mixin class that
> supplies a generic dump() method for debugging instances of classes
> that inherit from it.
More information about the Python-list
mailing list