On Sun, 23 Sep 2007 18:32:28 -0700, Kay Schluehr wrote: > On 22 Sep., 02:14, Bruno Desthuilliers > <[EMAIL PROTECTED]> wrote: >> Kay Schluehr a crit : >> (snip) >> >> > I checked out Io once and I disliked it. I expected Io's prototype OO >> > being just a more flexible variant of class based OO but Io couples a >> > prototype very closely to its offspring. When A produces B and A.f is >> > modified after production of B also B.f is modified. A controls the >> > state of B during the whole lifetime of B. I think parents shall not >> > do this, not in real life and also not in programming language >> > semantics. >> >> I may totally miss the point, but how is this different from: >> >> class A(object): >> def dothis(self): >> print "A.dothis(%s)" % self >> >> class B(A): >> pass >> >> b = B() >> >> b.dothis() >> >> def dothat(self): >> print "function dothat(%s)" % self >> >> A.dothis = dothat >> b.dothis() > > It's not a big deal because you do not use a class to propagate > mutable state unless you are using a class attribute intentionally ( i > guess you do not overuse it just to avoid object encapsulation and > make everything global ). When using a prototype as in Io you need to > protect the state of the child object yourself.
Just like in Python! Here `things` are shared between all "children": class A(object): things = list() def add(self, thing): self.things.append(thing) This is what happens too when you use this Io snippet: A := Object clone do( things := list() add := method(thing, self things append(thing) ) ) If you don't want `things` to be shared you write an `init` method, in both Python and Io. Python: class B(object): def __init__(self): self.things = list() def add(self, thing): self.things.append(thing) And Io: B := Object clone do( init := method( self things := list() self ) add := method(thing, self things append(thing) ) ) The `init` is called by the default `clone` method automatically just like `__init__()` in Python. It is really much like the class/instance relationship in Python with just the line between class and instance blurred. > You can do this by overwriting the objects slots but then you end up > writing your own object constructors and the templates accordingly, also > named "classes" by some. Not having dedicated object constructors, > member variable initializations and the presumed class definition > boilerplate comes at the price of introducing them on your own. The mechanism is already there in Io, no need to invent, just use it. Ciao, Marc 'BlackJack' Rintsch -- http://mail.python.org/mailman/listinfo/python-list