Python 3
Machine Learning

PENTRU ELEVII DE LICEU

LECȚIA 16
PAG. 4 / 4
OOP - Atribute și metode
Acasă >>> Lecții online

Metode speciale (magice)

Python permite definirea unor metode „speciale” sau magice – acele metode care încep și se termină cu dublu underscore, ca de exemplu:

__init__, __str__, __len__, __call__

Aceste metode sunt apelate automat în contexte specifice și pot fi suprascrise pentru a personaliza comportamentul obiectelor.

A. Metoda __init__

Acesta este constructorul clasei, apelat automat la crearea unei instanțe:

def __init__(self, parametri):
    # inițializarea obiectului


Permite configurarea inițială a atributelor unui obiect, stabilind valorile implicite sau preluarea datelor transmise prin parametri la momentul instanțierii.

B. Metoda __str__

Această metodă ajută la reprezentarea textuală a obiectului, fiind folosită atunci când apelăm la print(obj):

class Student:
    def __init__(self, nume, varsta):
        self.nume = nume
        self.varsta = varsta

    def __str__(self):
        return f"{self.nume} ({self.varsta} ani)"


Spre exemplu, dacă am executa acest cod:

elev = Student("Diana", 19)
print(elev) # Diana (19 ani)


am obține în consolă detaliile obiectului:



Fără metoda __str__, afișarea unui obiect returnează ceva de genul:



ceea ce nu este foarte informativ...

Metoda este extrem de importantă deoarece permite definirea modului în care un obiect este reprezentat sub formă de text, adică ceea ce se afișează în momentul în care obiectul este trecut într-o funcție precum print() sau convertit în șir de caractere folosind str(). Aceasta contribuie la creșterea lizibilității și facilitează înțelegerea datelor unui obiect atunci când este inspectat de către un alt programator.

C. Metoda __len__

Această metodă permite ca obiectul să fie folosit cu funcția len():

class Grup:
    def __init__(self, membri):
        self.membri = membri
    def __len__(self):
        return len(self.membri)


Aceasta metodă este utilă, de exemplu, în cazul în care dorim să reprezentăm grupuri de utilizatori, liste de elemente sau alte colecții personalizate, făcându-le compatibile cu funcționalitatea standard Python. Mai jos am creat un nou obiect al clasei, apoi apelăm metoda len():

g = Grup(["Ana", "Dan", "Mihai"])
print(len(g)) # 3


Rezultatul evident este



Atenție. Fără metoda specială __len__, apelarea funcției len() pe un obiect al clasei Grup ar genera o eroare de tip TypeError, deoarece Python nu ar ști cum să determine lungimea acestui obiect personalizat:



În absența implementării lui __len__, funcționalitatea standard nu ar fi compatibilă cu clasa definită, iar utilizatorii ar fi nevoiți să acceseze atributul intern, cum ar fi len(g.membri), pentru a obține rezultatul dorit.

Astfel, implementarea metodei speciale __len__ în clase personalizate permite compatibilitatea cu funcționalitățile standard Python, cum ar fi funcția len(), evitând erorile și facilitând utilizarea simplificată.

D. Metoda __call__

Metoda permite ca obiectul să fie apelat precum o funcție:

class Salut:
    def __call__(self, nume):
        print(f"Salut, {nume}!")

s = Salut()
s("Vlad") # Salut, Vlad!


Această funcționalitate este utilă în scenarii în care se dorește crearea unor obiecte care se comportă ca funcții, dar pot avea și stări interne sau alte atribute asociate.

Există mult mai multe astfel de funcții, precum __repr__, __eq__, __lt__, __add__, etc.

Metodele speciale de mai sus permit redefinirea comportamentului standard al operatorilor și al structurilor Python, oferind obiectelor o integrare naturală în limbaj. De exemplu, prin __eq__ putem specifica exact când două obiecte sunt considerate egale, iar prin __add__ putem personaliza cum se comportă operatorul + între instanțe ale clasei.

Concluzie. Metodele sunt esența comportamentului unei clase: ele transformă obiectele din simple structuri de date în entități active, capabile să interacționeze, să se modifice și să reacționeze la diferite contexte. Prin definirea atentă a metodelor obișnuite și speciale, putem construi obiecte inteligente, expresive și bine integrate în ecosistemul Python.
Lecția s-a încheiat acum.
 home   list  LECȚII   perm_identity   arrow_upward