lazy arithmetic

Simon Forman rogue_pedro at yahoo.com
Fri Aug 25 01:58:23 EDT 2006


pianomaestro at gmail.com wrote:
> Gabriel Genellina wrote:
> > At Friday 25/8/2006 00:36, pianomaestro at gmail.com wrote:
> >
> > ># This is what I have in mind:
> > >
> > >class Item(object):
> > >   def __add__(self, other):
> > >     return Add(self, other)
> >
> > And this works fine... why make thinks complicated?
>
> Yes, I agree it's simpler, and up until now that's the way
> I always did it. Many Many times.
> Now I am looking for a way to build ensembles of these lazy classes at
> the meta-level.
> (think abstract algebra).
>
> > >Item.__add__ = Add
> >
> > This doesn't make sense... __add__ should be a method, not a class...
>
> No, that's not true. It can be this callable:
>
> def add(a, b):
>   return Add(a,b)
> Item.__add__ = add

But that's a function, not a class.  When you assign add to an
attribute of Item it "magically" becomes a method of Item:

|>> add
<function add at 0xb6f3b95c>
|>> Item.__add__
<unbound method Item.add>
|>> x.__add__
<bound method Item.add of <__main__.Item object at 0xb6f3af2c>>

So it works fine.


>
> So my thinking was this: why can't I use a callable class ?
>

When you assign a class to an attibute (be it __add__ or __banana__ or
anything else) the "magic" doesn't take place:

|>> Add
<class '__main__.Add'>
|>> Item.__banana__ = Add
|>> Item.__banana__
<class '__main__.Add'>



> > x+y get translated to x.__add__(y)
>
> No that's not true at all. The self argument to __add__ ends
> up being the Add instance, not the Item instance:

No, that's *exactly* true.  "x+y" does mean "x.__add__(y)" and
"x.__add__"  *is*  the class Add, so you're really calling "Add(y)",
nothing more nor less.

x+y  =>
x.__add__(y)  =>
(x.__add__)(y)  =>
Add(Y)  =>
Hello new Add instance, here's a y for you...  :-)

>
> z=x+y  is translated to z.__add__(y)

Nope.  Just plain wrong.  Not sure why you'd think that.
(No offense intended.)

Peace,
~Simon F.

> 
> Simon.




More information about the Python-list mailing list