On Apr 4, 12:41 pm, "7stud" <[EMAIL PROTECTED]> wrote: > On Apr 4, 3:36 am, "looping" <[EMAIL PROTECTED]> wrote: > > > > > Hi, > > for the fun I try operator overloading experiences and I didn't > > exactly understand how it works. > > > Here is my try:>>> class myint(int): > > > def __pow__(self, value): > > return self.__add__(value) > > > >>> a = myint(3) > > >>> a ** 3 > > > 6 > > > OK, it works. Now I try different way to achieve the same result but > > without much luck: > > > >>> class myint(int): > > pass > > >>> myint.__pow__ = myint.__add__ > > > or:>>> class myint(int): > > > __pow__ = int.__add__ > > > or: > > > >>> class myint(int): > > pass > > >>> a.__pow__ = a.__add__ > > > but for every try the result was the same:>>> a = myint(3) > > >>> a ** 3 > > > 27 > > > Why it doesn't works ? > > Look at the output of the following code: > > class myint(int): > pass > > print myint.__pow__ > print myint.__add__ > > -----output:----- > <slot wrapper '__pow__' of 'int' objects> > <slot wrapper '__add__' of 'int' objects> > > That shows that the names '__pow__' and '__add__' are __slots__. > According to Python in a Nutshell(p.102), a name that is a slot can > only be "bound"(i.e. assigned to) inside the class body. Any later > attempt to assign something to a name that is a slot has no effect. > In your case, I think that means that the only place you can assign > something to an int slot is inside the int class. > > As an alternative, you could override __pow__(). Something like this: > > class myint(int): > def __pow__(self, num): > return super(myint, self).__add__(num) > > n = myint(3) > print n**3 > > ---output:--- > 6 > > That doesn't attempt to reassign something to the slot int.__pow__; > rather it creates a new __pow__ name that hides int.__pow__.
Hmmm...after reading Ziga's post and doing some more testing, I don't think __slots__ has anything to do with it. -- http://mail.python.org/mailman/listinfo/python-list