Conținut curs
Python Avansat
Despre lecție
  1. Introducere în metodele magice

    • Definiția metodelor magice
    • Cum funcționează metodele magice
    • De ce sunt utile metodele magice
  2. Metode magice de bază

    • __init__
    • __str__
    • __repr__
    • Exemple și exerciții
  3. Operator overloading: aritmetic

    • __add__
    • __sub__
    • __mul__
    • __truediv__
    • __floordiv__
    • __mod__
    • __pow__
    • Exemple și exerciții
  4. Operator overloading: comparare

    • __eq__
    • __ne__
    • __lt__
    • __le__
    • __gt__
    • __ge__
    • Exemple și exerciții
  5. Operator overloading: atribuire

    • __setattr__
    • __delattr__
    • __getattribute__
    • Exemple și exerciții
  6. Operator overloading: managementul alocării și dezalocării memoriei

    • __new__
    • __del__
    • Exemple și exerciții
  7. Operator overloading: tipuri de date container

    • __len__
    • __getitem__
    • __setitem__
    • __delitem__
    • __iter__
    • __contains__
    • Exemple și exerciții
  8. Operator overloading: apelarea funcțiilor * __call__

    • Exemple și exerciții
  9. Operator overloading: managementul contextului

    • __enter__
    • __exit__
    • Exemple și exerciții
  10. Operator overloading: reprezentare

    • __format__
    • __hash__
    • Exemple și exerciții

Exemple și exerciții pentru fiecare subpunct:

Exemplu __str__ și __repr__:

python
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:

python
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.

python
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.