Pisałem w poprzednim poście o tym, że zacząłem interesować się językiem Python. Jestem w trakcie lektury “Python od podstaw” dodatkowo na jednym z przedmiotów do wyboru używamy tego języka. No i tak na początek dostaliśmy parę łatwych programików do napisania. Jednym z nich było zrobienie swojej klasy do przechowywania liczb zespolonych. Tak wygląda kod w Pythonie:
[python]
class MyComplex:
def __init__(self, re=0.0, im=0.0):
self.re = re
self.im = im
def __str__(self):
”’String representation of MyComplex”’
if self.im > 0:
return ‘(%.2f + %.2fi)’ % (self.re,self.im)
else:
return ‘(%.2f - %.2fi)’ % (self.re,-self.im)
def __eq__(self, other):
”’Equal operator (==)”’
if(type(other)==type(self)):
if self.im == other.im and self.re == other.re:
return True
else:
return False
elif(type(other)==type(1j)):
if self.im == other.imag and self.re == other.real:
return True
else:
return False
def __ne__(self, other):
”’NotEqual operator (!=)”’
if(type(other)==type(self)):
if self.im == other.im and self.re == other.re:
return False
else:
return True
elif(type(other)==type(1j)):
if self.im == other.imag and self.re == other.real:
return False
else:
return True
def __add__(self,other):
”’Add operator (+)”’
if(type(other)==type(self)):
tmp = MyComplex(self.re, self.im)
tmp.re += other.re
tmp.im += other.im
return tmp
if(type(other)==type(0.0) or type(other)==type(0)):
tmp = MyComplex(self.re, self.im)
tmp.re += other
return tmp
def __sub__(self,other):
”’Sub operator (-)”’
if(type(other)==type(self)):
tmp = MyComplex(self.re, self.im)
tmp.re -= other.re
tmp.im -= other.im
return tmp
if(type(other)==type(0.0) or type(other)==type(0)):
tmp = MyComplex(self.re, self.im)
tmp.re -= other
return tmp
def __div__(self,other):
”’Div operator (/)”’
if(type(other)==type(self)):
tmp = MyComplex()
tmp.re = (self.re*other.re + self.im*other.im)*1.0/(other.re*other.re + other.im*other.im)
tmp.im = (self.im*other.re - self.re*other.im)*1.0/(other.re*other.re + other.im*other.im)
return tmp
if(type(other)==type(0.0) or type(other)==type(0)):
tmp = MyComplex(self.re, self.im)
tmp.re /= other
tmp.im /= other
return tmp
def __mul__(self,other):
”’Mul operator (*)”’
if(type(other)==type(self)):
tmp = MyComplex()
tmp.re = self.re*other.re - self.im*other.im
tmp.im = self.re*other.im + self.im*other.re
return tmp
if(type(other)==type(0.0) or type(other)==type(0)):
tmp = MyComplex(self.re, self.im)
tmp.re *= other
tmp.im *= other
return tmp
def __iadd__(self,other):
”’Operator (+=)”’
tmp = MyComplex()
tmp = self+other
return tmp
def __isub__(self,other):
”’Operator (-=)”’
tmp = MyComplex()
tmp = self-other
return tmp
def __imul__(self,other):
”’Operator (*=)”’
tmp = MyComplex()
tmp = self*other
return tmp
def __idiv__(self,other):
”’Operator (/=)”’
tmp = MyComplex()
tmp = self/other
return tmp
[/python]
W klasie MyComplex przeładowałem kilka operatorów tj =,-,*,/,+=,-=,*=,/= .
- __add__ przeładowanie +
- __sub__ przeładowanie -
- __div__ przeładowanie /
- __mul__ przeładowanie *
- __iadd__ przeładowanie +=
- __isub__ przeładowanie -=
- __idiv__ przeładowanie /=
- __imul__ przeładowanie *=
- __eq__ przeładowanie ==
- __ne__ przeładowanie !=
Funkcja __str__ odpowiada za wyświetlanie obiektu - taki odpowiednik Javovego toString(). __init__ natomiast jest konstruktorem klasy. Jak pewnie od razu wszyscy zauważyli Python nie wymaga określania typu zmiennych co wydaje się być niekiedy plusem.
Widzę że formatowanie kodu Pythona w wordpress pozostawia sporo do życzenia ;/ W Pythonie istotne są wcięcia, które tu zniknęły.

Ostatnie komentarze