deriving from complex

  • Thread starter =?ISO-8859-1?Q?Sch=FCle_Daniel?=
  • Start date
?

=?ISO-8859-1?Q?Sch=FCle_Daniel?=

Hello

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

so first I wrote a standalone function
.... re, im = r*cos(arg), r*sin(arg)
.... return re + im*1j

then I tried to extend this to a class
.... 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)
....Traceback (most recent call last):

and got stuck with this error
it seems that last argument is rejected
because complex wants to have 2 arguments
but this works well ..
.... def __init__(self,a):
.... self.a = a
........ def __init__(self,a,b):
.... self.a = a
.... self.b = b
....
what's causing the above exception?

one more question
.... def __init__(self,x,y):
.... self.real = x
.... self.imag = y
....Traceback (most recent call last):
File "<stdin>", line 1, in ?

how can I work around this problem?

Regards, Daniel
 
?

=?ISO-8859-1?Q?Sch=FCle_Daniel?=

what do you think of this design?
.... 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.0000000000000002+1j)
>>> polar((2**0.5, 45.0/360*2*pi)) (1.0000000000000002+1j)
>>> polar([2**0.5, 45.0/360*2*pi]) (1.0000000000000002+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
 
S

Scott David Daniels

Schüle Daniel said:
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...:
... re, im = r*cos(arg), r*sin(arg)
... return re + im*1j
then I tried to extend this to a class
... 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
(e-mail address removed)
 
S

Scott David Daniels

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
(e-mail address removed)
 
S

Scott David Daniels

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
(e-mail address removed)
 
?

=?ISO-8859-1?Q?Sch=FCle_Daniel?=

thank you
I will have to take a closer look on __new__

Regards, Daniel
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,052
Latest member
LucyCarper

Latest Threads

Top