2001 Enchancement Wishlist
Jeff Epler
jepler at inetnebr.com
Sat Dec 30 13:43:04 EST 2000
More information about the Python-list mailing list
Sat Dec 30 13:43:04 EST 2000
- Previous message (by thread): 2001 Enchancement Wishlist
- Next message (by thread): Returning something else from __init__ -- was Re: 2001 Enchancement Wishlist
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Sat, 30 Dec 2000 10:52:10 +0200, Pearu Peterson >I see that many Python experts are against this proposal but anyway, I >would like to support this idea with the following examples. > >Say, I would like to define > >class Real: > def __init__(self,num): > self.num = num > <other number class methods> > >class Complex: > def __init__(self,real,imag): > if imag == 0: > return Real(real) > self.real,self.imag = real,imag > <other number class methods> > >That is, if imaginary part of a Complex number is zero, it's constructor >would return Real instance: I think that this can be accomplished by using a 'transmute' function, defined something like the following: def transmute(instance, newclass, *args, **kw): instance.__class__ = newclass apply(instance.__init__, args, kw) return instance it can be useful other places than __init__, for one thing. See Complex.__iadd__. class Real: def __init__(self, num): self.num = num # numeric methods class Complex: def __init__(self, real, imag=0): if not imag: transmute(self, Real, real) return self.real, self.imag = real, imag def __iadd__(self, other): self.real += other.real self.imag += other.imag if not self.imag: transmute(self, Real, self.real) return self # Other numeric methods >>> complex(1,0) <Real 1> >>> c = complex(1,1) >>> print c <Complex 1+1i> >>> c += complex(1,-1) <Real 2> Is there anything that you would like to do which transmute cannot? One issue I see is whether the dictionary should be cleared in the object before it is transmuted (for instance, "c" still has attributes 'real' and 'imaginary' after it is transmuted in Complex.__iadd__) but I don't see anything that is just plain impossible. Toss transmute in your standard library somewhere, and you have a nice way to write this code---just a function call. Or make it a method on a common base class. I don't know whether "self.transmute(Real, self.real)" makes any more or less sense than I wrote it above. Jeff
- Previous message (by thread): 2001 Enchancement Wishlist
- Next message (by thread): Returning something else from __init__ -- was Re: 2001 Enchancement Wishlist
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list