-
Introducere în metodele magice
- Definiția metodelor magice
- Cum funcționează metodele magice
- De ce sunt utile metodele magice
-
Metode magice de bază
__init____str____repr__- Exemple și exerciții
-
Operator overloading: aritmetic
__add____sub____mul____truediv____floordiv____mod____pow__- Exemple și exerciții
-
Operator overloading: comparare
__eq____ne____lt____le____gt____ge__- Exemple și exerciții
-
Operator overloading: atribuire
__setattr____delattr____getattribute__- Exemple și exerciții
-
Operator overloading: managementul alocării și dezalocării memoriei
__new____del__- Exemple și exerciții
-
Operator overloading: tipuri de date container
__len____getitem____setitem____delitem____iter____contains__- Exemple și exerciții
-
Operator overloading: apelarea funcțiilor *
__call__- Exemple și exerciții
-
Operator overloading: managementul contextului
__enter____exit__- Exemple și exerciții
-
Operator overloading: reprezentare
__format____hash__- Exemple și exerciții
Exemple și exerciții pentru fiecare subpunct:
Exemplu __str__ și __repr__:
class Punct:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"({self.x}, {self.y})"
def __repr__(self):
return f"Punct({self.x}, {self.y})"
p = Punct(2, 3)
print(str(p)) # (2, 3)
print(repr(p)) # Punct(2, 3)
Exercițiu:
Creați o clasă Complex care să reprezinte numere complexe. Implementați metodele magice __add__, __sub__, __mul__, __str__ și __repr__ pentru clasa Complex.
Exemplu de implementare a metodelor magice pentru operatorul de adunare:
class Numar:
def __init__(self, val):
self.val = val
def __add__(self, alt_numar):
return Numar(self.val + alt_numar.val)
n1 = Numar(3)
n2 = Numar(4)
n3 = n1 + n2
print(n3.val) # 7
Exercițiu:
Creați o clasă Stiva care să reprezinte o stivă de numere întregi. Implementați metodele magice __len__, __getitem__, __setitem__, __delitem__, __iter__ și __contains__ pentru clasa Stiva.
Iată un exemplu complet pentru clasa Complex și metodele magice de adunare, scădere și înmulțire.
class Complex:
def __init__(self, real, imag):
self.real = real
self.imag = imag
def __add__(self, other):
return Complex(self.real + other.real, self.imag + other.imag)
def __sub__(self, other):
return Complex(self.real - other.real, self.imag - other.imag)
def __mul__(self, other):
real = self.real * other.real - self.imag * other.imag
imag = self.real * other.imag + self.imag * other.real
return Complex(real, imag)
def __str__(self):
return f"{self.real} + {self.imag}i"
def __repr__(self):
return f"Complex({self.real}, {self.imag})"
c1 = Complex(2, 3)
c2 = Complex(1, 4)
c3 = c1 + c2
c4 = c1 - c2
c5 = c1 * c2
print(str(c3)) # 3 + 7i
print(repr(c3)) # Complex(3, 7)
print(str(c4)) # 1 - 1i
print(repr(c4)) # Complex(1, -1)
print(str(c5)) # -10 + 11i
print(repr(c5)) # Complex(-10, 11)
Acest exemplu prezintă cum să implementați metodele magice __add__, __sub__ și __mul__ pentru a efectua operații aritmetice între obiecte de tip Complex. De asemenea, metodele __str__ și __repr__ sunt implementate pentru a afișa numerele complexe într-un format ușor de citit.