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

Reply via email to