Re: deriving from complex
Schüle Daniel wrote: thank you I will have to take a closer look on __new__ Regards, Daniel The pypy implementation of the complex builtin may give you some clues. I found it helpful. http://codespeak.net/svn/pypy/dist/pypy/lib/cmath.py Art -- http://mail.python.org/mailman/listinfo/python-list
Re: deriving from complex
Meant: http://codespeak.net/svn/pypy/dist/pypy/module/__builtin__/app_complex.py -- http://mail.python.org/mailman/listinfo/python-list
Re: deriving from complex
what do you think of this design? def polar(x,y=None): ... if type(x) in (list,tuple) and len(x) == 2 and y is None: ... return complex(x[0]*cos(x[1]), x[0]*sin(x[1])) ... if type(x) is complex and y is None: ... return (abs(x), atan2(x.imag,x.real)) ... if type(x) in (float, int, long) and type(y) in (float, int, long): ... return complex(x*cos(y), x*sin(y)) ... polar(2**0.5, 45.0/360*2*pi) (1.0002+1j) polar((2**0.5, 45.0/360*2*pi)) (1.0002+1j) polar([2**0.5, 45.0/360*2*pi]) (1.0002+1j) polar(1+1j) (1.4142135623730951, 0.78539816339744828) btw I like how Ruby handles the creation of complex numbers c = Complex(1,1) p = Complex.polar(1,45.0/360*2*PI) Regards, Daniel -- http://mail.python.org/mailman/listinfo/python-list
Re: deriving from complex
Schüle Daniel wrote: I am trying to customize the handling of complex numbers what I am missing is a builtin possibility to create complex numbers in polar coordinates I wrote...: def polar(r,arg): ... re, im = r*cos(arg), r*sin(arg) ... return re + im*1j then I tried to extend this to a class class Complex(complex): ... def __init__(self,x,y,polar=False): ... if not polar: ... self.re, self.im = x,y ... else: ... self.re, self.im = x*cos(y), x*sin(y) What you are missing is that complex is an immutable type. You need to fiddle with __new__, not __init__. class Complex(complex): def __new__(class_, x, y=0.0, polar=False): if polar: return complex.__new__(class_, x * cos(y), x * sin(y)) else: return complex.__new__(class_, x, y) Which will produce instances of Complex, or: class Complex(complex): def __new__(class_, x, y=0.0, polar=False): if polar: return complex(x * cos(y), x * sin(y)) else: return complex(class_, x, y) Which will produce instances of complex. --Scott David Daniels [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list
Re: deriving from complex
Scott David Daniels wrote: Schüle Daniel wrote: ... And, of course, I reply with a cutto-pasto (pre-success code). ... Which will produce instances of Complex, or: class Complex(complex): def __new__(class_, x, y=0.0, polar=False): if polar: return complex(x * cos(y), x * sin(y)) else: return complex(class_, x, y) This last line should, of course, be: return complex(x, y) --Scott David Daniels [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list
Re: deriving from complex
Schüle Daniel wrote: ... btw I like how Ruby handles the creation of complex numbers c = Complex(1,1) p = Complex.polar(1,45.0/360*2*PI) class Complex(complex): @classmethod def polar(class_, radius, angle): return class_(radius * cos(angle), radius * sin(angle)) --Scott David Daniels [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list
Re: deriving from complex
thank you I will have to take a closer look on __new__ Regards, Daniel -- http://mail.python.org/mailman/listinfo/python-list