[EMAIL PROTECTED] wrote: > # This is what I have in mind: > > class Item(object): > def __add__(self, other): > return Add(self, other) > > class Add(Item): > def __init__(self, a, b): > self.a = a > self.b = b > > a = Item() > b = Item() > > c = a+b > > # Now, I am going absolutely crazy with this idea > # and using it in a big way. So I'm looking at > # automating the process. As a first step, > # I thought maybe this would work: > > class Item(object): > pass > > class Add(Item): > def __init__(self, a, b=None): > print self, a, b > self.a = a > self.b = b > > Item.__add__ = Add > > x = Item() > y = Item() > > print x, y > > c = x+y > > # This time, the Add constructor gets only the first two arguments: > "self" and "y". > # So, what happened to "x" ? Is this some kind of property voodoo going > on ?
Indeed. Read up on descriptors: http://users.rcn.com/python/download/Descriptor.htm The following seems to work: from new import instancemethod class Add: class __metaclass__(type): def __get__(self, inst, cls): if inst is None: return cls return instancemethod(cls, inst, cls) def __init__(self, a, b=None): self.a = a self.b = b def __str__(self): return "%s(%s, %s)" % (self.__class__.__name__, self.a, self.b) Add.__add__ = Add print Add(1, 2) + 42 but makes the simple def __add__(self, other): return Add(self, other) all the more attractive. Peter -- http://mail.python.org/mailman/listinfo/python-list