# how to build a street with more than 1 house ?

Stef Mientki stef.mientki at gmail.com
Sat Jun 7 23:21:05 CEST 2008

```thanks guys,

David C. Ullrich wrote:
> On Sat, 07 Jun 2008 00:45:07 +0200, Stef Mientki
> <stef.mientki at gmail.com> 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
>

```