scientific-programming-exer.../ex_18.py

51 lines
1.7 KiB
Python

from cmath import exp
class PolarComplex(object):
def __init__(self, r, phi):
self._r = r
self._phi = phi
def __repr__(self):
return "{}({}, {})".format(PolarComplex.__name__, self._r, self._phi)
def __abs__(self):
return abs(self._r)
def __mul__(self, other):
if(isinstance(other, (int, float))):
return PolarComplex(self._r * other, self._phi)
if(isinstance(other, PolarComplex)):
return PolarComplex(self._r * other._r, self._phi + other._phi)
raise TypeError("*: cannot multiply {} and {}".format(type(other), type(self)))
def __truediv__(self, other):
if(isinstance(other, (int, float))):
return PolarComplex(self._r / other, self._phi)
if(isinstance(other, PolarComplex)):
return PolarComplex(self._r / other._r, self._phi - other._phi)
raise TypeError("/: cannot divide {} and {}".format(type(other), type(self)))
def __str__(self):
return str(self._r * exp(1j * self._phi))
def __rmul__(self):
if(isinstance(other, (int, float))):
return PolarComplex(self._r * other, self._phi)
if(isinstance(other, PolarComplex)):
return PolarComplex(self._r * other._r, self._phi + other._phi)
raise TypeError("*: cannot multiply {} and {}".format(type(other), type(self)))
def __rtruediv__(self, other):
if(isinstance(other, (int, float))):
return PolarComplex(other / self._r, -self._phi)
if(isinstance(other, PolarComplex)):
return PolarComplex(other._r / self._r, other._phi - self._phi)
raise TypeError("/: cannot divide {} and {}".format(type(other), type(self)))
if( __name__ == "__main__"):
c = PolarComplex(3, 0.3)
print(repr(c))
print(str(c))
print(repr(c / 3))
print(repr(c * 3))
z = PolarComplex(2, 0.2)
print(repr(c * z))
print(repr(c / z))