Re: how to build a street with more than 1 house ?

2008-06-07 Thread David C. Ullrich
On Sat, 07 Jun 2008 00:45:07 +0200, Stef Mientki
[EMAIL PROTECTED] wrote:

hello,

In the code below, I can build a large street like this:
  large_street = house * 25
but not a small street. like this:
  small_street = 5 * house

Why is this different ?

Because you're multiplying on the left in one
case and on the right in the other.

You realize that house*5 should work, right?

And more interesting, how do I get the right results ?

thanks,
Stef Mientki

class type_house ( object ) :
  def __init__( self, front_doors = 1 ) :
self.front_doors = front_doors
  def __mul__ ( self, b ) :
return type_house ( self.front_doors * b )

The reason house*25 works is that the __mul__
method says what it should be. If you want
5*house to work you need a __rmul__.
Nothing in Python automatically makes
a*b the same as b*a; when it sees 5*house
first it checks 5 to see whether it knows
whether it knows what 5*house should be
(no, 5 never heard of this house thing), then
it checks house to see if it knows what
5*house should be (no, house has no
__rmul__).

The simplest thing is just to define __rmul__
to make multiplication commuttative:

  def __rmul__(self, b):
Defines what b*self should return.
return self*b

Now 5*house calls __rmul__, which
returns house*5. That in turn calls __mul__,
which returns what you want. And some day
when you modify __mul__ (in a subclass?)
you won't need to worry about making the
same change to __rmul__.

house = type_house ()
large_street = house * 25
print large_street.front_doors
small_street = 5 * house
print small_street.front_doors

David C. Ullrich
--
http://mail.python.org/mailman/listinfo/python-list


Re: how to build a street with more than 1 house ?

2008-06-07 Thread Stef Mientki

thanks guys,

David C. Ullrich wrote:

On Sat, 07 Jun 2008 00:45:07 +0200, Stef Mientki
[EMAIL PROTECTED] wrote:

  

hello,

In the code below, I can build a large street like this:
 large_street = house * 25
but not a small street. like this:
 small_street = 5 * house

Why is this different ?



Because you're multiplying on the left in one
case and on the right in the other.

You realize that house*5 should work, right?

  

yes.

And more interesting, how do I get the right results ?

thanks,
Stef Mientki

class type_house ( object ) :
 def __init__( self, front_doors = 1 ) :
   self.front_doors = front_doors
 def __mul__ ( self, b ) :
   return type_house ( self.front_doors * b )



The reason house*25 works is that the __mul__
method says what it should be. If you want
5*house to work you need a __rmul__.
Nothing in Python automatically makes
a*b the same as b*a; when it sees 5*house
first it checks 5 to see whether it knows
whether it knows what 5*house should be
(no, 5 never heard of this house thing), then
it checks house to see if it knows what
5*house should be (no, house has no
__rmul__).

The simplest thing is just to define __rmul__
to make multiplication commuttative:
  

Aha, now a bell begins to ring ...

  def __rmul__(self, b):
Defines what b*self should return.
return self*b
  

this works indeed ...

Now 5*house calls __rmul__, which
returns house*5. That in turn calls __mul__,
which returns what you want. And some day
when you modify __mul__ (in a subclass?)
you won't need to worry about making the
same change to __rmul__.

  

thanks for the clear explanation.

cheers,
Stef

house = type_house ()
large_street = house * 25
print large_street.front_doors
small_street = 5 * house
print small_street.front_doors



David C. Ullrich
--
http://mail.python.org/mailman/listinfo/python-list
  


--
http://mail.python.org/mailman/listinfo/python-list


how to build a street with more than 1 house ?

2008-06-06 Thread Stef Mientki

hello,

In the code below, I can build a large street like this:
 large_street = house * 25
but not a small street. like this:
 small_street = 5 * house

Why is this different ?
And more interesting, how do I get the right results ?

thanks,
Stef Mientki

class type_house ( object ) :
 def __init__( self, front_doors = 1 ) :
   self.front_doors = front_doors
 def __mul__ ( self, b ) :
   return type_house ( self.front_doors * b )

house = type_house ()
large_street = house * 25
print large_street.front_doors
small_street = 5 * house
print small_street.front_doors

--
http://mail.python.org/mailman/listinfo/python-list


Re: how to build a street with more than 1 house ?

2008-06-06 Thread Tommy Grav


On Jun 6, 2008, at 6:45 PM, Stef Mientki wrote:


hello,

In the code below, I can build a large street like this:
large_street = house * 25
but not a small street. like this:
small_street = 5 * house


This calls the int.__mul__() code i believe.


Why is this different ?
And more interesting, how do I get the right results ?


If memory serves me right look into __rmul__().

Cheers
  Tommy
--
http://mail.python.org/mailman/listinfo/python-list