how to build a street with more than 1 house ?
David C. Ullrich
dullrich at sprynet.com
Sat Jun 7 15:48:13 CEST 2008
On Sat, 07 Jun 2008 00:45:07 +0200, Stef Mientki
<stef.mientki at gmail.com> wrote:
>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 ?
>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
The simplest thing is just to define __rmul__
to make multiplication commuttative:
def __rmul__(self, b):
"""Defines what b*self should return."""
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
>small_street = 5 * house
David C. Ullrich
More information about the Python-list