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