InfoBook.ro ← Harta anului
Modul 10 · Introducere în POO
Modul 10 · Conținut 3.2

Primul contact cu obiectele

Orice obiect are proprietăți (date) și comportamente (metode) — exact ca în viața reală. Surpriza lecției: folosești obiecte de luni de zile fără să știi. Azi le vezi pe față.

🎯 Obiectiv 1Deosebești clasa (tiparul) de obiect (instanța concretă) și le identifici membrii.
🎯 Obiectiv 2Recunoști clasele predefinite folosite deja: list, TextIOWrapper, ifstream.
🎯 Obiectiv 3Instanțiezi obiecte și le accesezi membrii cu punct: obiect.metoda().
1

Clasă vs obiect — rețeta vs prăjitura

Clasa e tiparul: descrie CE proprietăți și CE comportamente are un tip nou. Obiectul e prăjitura concretă. Apasă pe un elev!

CLASA: Elev

tiparul / rețeta — scrisă O SINGURĂ dată
numestr
varstaint
mediefloat
afiseaza()metodă
promovat()metodă
— instanțiere →
👆 apasă pe un obiect — membrii lui vin direct din tiparul clasei

🤔 De ce ne-ar trebui un tip nou?

Până acum, ca să ții minte trei elevi, foloseai liste paralele. Funcționează — până în clipa în care ștergi ceva dintr-una singură.

✘ fără clase — datele stau împrăștiate
1nume = ["Ana", "Mihai", "Ioana"]
2varsta = [15, 16, 15]
3medie = [9.2, 7.8, 4.3]
4 
5nume.pop(0) # stergem un singur nume…
6nume[0], varsta[0], medie[0]
7# Mihai 15 9.2 — date amestecate!
✔ cu clase — fiecare elev, o singură bucată
1e1 = Elev("Ana", 15, 9.2)
2e2 = Elev("Mihai", 16, 7.8)
3e3 = Elev("Ioana", 15, 4.3)
4 
5catalog = [e1, e2, e3]
6catalog.pop(0) # pleaca TOT elevul
7# nimic nu se poate desincroniza
Regula pe care o înveți azi: datele care descriu același lucru trebuie ținute împreună — și lângă ele, acțiunile care le folosesc. Asta e tot ce înseamnă programarea pe obiecte.
Vocabular oficial (programa 3.2): clasă = tiparul; membri = datele (proprietățile) + metodele (funcțiile) descrise în tipar; obiect = o instanță concretă; instanțiere = crearea obiectului din clasă.
2

Plot twist: folosești obiecte de luni de zile

Programa cere „utilizarea claselor predefinite" — și exact asta ai făcut tot anul, fără să știi numele conceptului:

Tk (Tkinter)

fereastra = tk.Tk() — chiar modulul următor instanțiază obiecte-fereastră cu metode ca .mainloop(). (M12)

list

v.append(5), v.sort() — lista e obiect al clasei list; metodele le știi pe de rost. (M05c)

TextIOWrapper

f = open(...) creează un obiect; f.readline() și f.close() sunt metodele lui. (M10)

ifstream (C++)

fin e un obiect al clasei ifstream; fin.close() e apel de metodă — POO există și în C++!

🔬 Dovada live — lista ta e un obiect

v = []
apelează o metodă a obiectului 👆
Punctul = poarta spre membri. De fiecare dată când ai scris ceva.ceva(), ai făcut POO: obiect.metodă(). Singura noutate de azi e că poți construi TU tiparul.
3

Instanțierea și accesul la membri

Definești clasa o dată, apoi creezi câte obiecte vrei. Fiecare acces trece prin punct: obiect.proprietate, obiect.metoda().

1class Elev:
2 def __init__(self, nume, nota):
3 self.nume = nume # proprietăți
4 self.nota = nota
5 def afiseaza(self): # metodă
6 print(self.nume, self.nota)
7 
8e1 = Elev("Maria", 9.5) # INSTANȚIERE
9e1.afiseaza() # acces cu punct
Cine e __init__? Constructorul — metoda specială care rulează AUTOMAT la instanțiere și umple proprietățile obiectului nou. self = „obiectul însuși": self.nume înseamnă „numele MEU", al obiectului care tocmai se naște. De-asta e1 și e2 pot avea nume diferite din același tipar.
Greșeala clasică: uiți self ca prim parametru la metode → „takes 1 positional argument but 2 were given". Python trimite obiectul automat, dar TU trebuie să-i lași locul.
4

Mini-proiectul: fabrica de obiecte

Clasa Elev e definită mai sus. Instanțiaz-o chiar aici: dă-i nume și notă unui elev nou, apoi apelează-i metodele.

nume = "" nota =
instanțiază primul obiect 👆 — apoi apasă-i metodele
Observă: toate obiectele au ACELEAȘI metode (vin din tipar), dar date DIFERITE (primite la instanțiere). Exact ca prăjiturile din aceeași rețetă cu ingrediente diferite.
5

Două feluri de metode — și obiectul care știe să se prezinte

Unele metode îți întorc un răspuns și nu ating nimic. Altele schimbă datele obiectului. Iar __str__ îi spune lui print cum să arate obiectul.

metodă care CITEȘTE — are return
1class Dreptunghi:
2 def __init__(self, L, l):
3 self.L = L
4 self.l = l
5 
6 def arie(self):
7 return self.L * self.l

Obiectul rămâne neatins. Se comportă exact ca un subprogram cu return (Modulul 05) — doar că își ia datele din self.

metodă care MODIFICĂ — de obicei fără return
1class Cos:
2 def __init__(self):
3 self.preturi = [] # o LISTA ca proprietate
4 
5 def adauga(self, pret):
6 self.preturi.append(pret)
7# dupa apel, obiectul e ALTFEL decat era

O proprietate poate fi chiar o listă (Modulul 04a). Obiectul „ține minte" între apeluri — asta e starea lui.

🛒 Încearcă: un obiect cu stare

Fiecare apăsare apelează o metodă. Urmărește cum se schimbă self.preturi.

coșul e gol — apasă o metodă 👆

✨ __str__ — obiectul care se prezintă singur

1class Produs:
2 def __init__(self, nume, pret, cant):
3 self.nume = nume
4 self.pret = pret
5 self.cant = cant
6 
7 def valoare(self):
8 return self.pret * self.cant
9 
10 def __str__(self):
11 return f"{self.nume}: {self.valoare()} lei"
Fără __str__, print(p) scrie ceva de genul <__main__.Produs object at 0x000001> — adresa din memorie, complet inutilă pentru om.
Cu __str__, print(p) scrie caiet: 15.0 lei. Python cheamă metoda automat, nu o apelezi tu niciodată direct. E prima ta metodă specială — se recunosc după cele două underscore de la capete, ca __init__.
6

Verificare rapidă

Cinci întrebări — vocabularul POO trebuie să fie beton.

7

Fișa de sinteză

POO în șase idei.

Clasa = tiparul (rețeta): descrie proprietățile și metodele. Se scrie O dată.
Obiectul = instanța concretă (prăjitura): date proprii, comportamente din tipar.
Membri = proprietăți (date) + metode (funcții). Acces cu punct: obiect.membru.
Instanțiere: e1 = Elev("Maria", 9.5) — constructorul __init__ rulează automat; self = obiectul însuși.
Ai folosit deja clase predefinite: list, TextIOWrapper, ifstream/ofstream — iar Tk (Tkinter) urmează imediat.
Două feluri de metode: unele întorc un răspuns (arie(), promovat()), altele schimbă starea obiectului (adauga(), depune()).
__str__(self): metoda specială care îi spune lui print cum să afișeze obiectul — altfel vezi adresa din memorie.
O listă de obiecte e catalogul întreg: for e in catalog: print(e.nume, e.promovat()).
De ce contează: tot liceul de aici încolo (și Tkinter, chiar următorul modul!) e construit pe obiecte.
🐍 Descarcă fișierul Python al lecțieiClasa_Obiect_Python.py — de la listele paralele până la o listă de obiecte salvată în fișier: 8 capitole, fiecare urmat de 5 exerciții rezolvate. Rulabil în VS Code, comentat linie cu linie — gândit să fie scris live, împreună cu clasa. ⬇ descarcă
8

📌 Temă pentru acasă

Trei exerciții în Python, exact în stilul lecției. Fiecare = o clasă cu date + o metodă care „face ceva".

Reamintește-ți rețeta: class Nume: · constructorul __init__(self, …) umple proprietățile prin self. · metodele primesc și ele self ca prim parametru.
  1. Clasa Elev. Proprietăți: nume, media. Metodă promovat() care returnează True dacă media ≥ 5. Creează 3 obiecte și afișează, pentru fiecare, numele și „promovat/corigent".
  2. Clasa Dreptunghi. Proprietăți: lungime, lățime. Metode arie() și perimetru(). Creează un dreptunghi 5×3 și afișează cele două rezultate.
  3. Clasa CosCumparaturi. Proprietate: o listă de prețuri (începe goală). Metode adauga(pret) și total(). Adaugă 3 produse și afișează totalul — folosește o LISTĂ ca proprietate (Modulul 04a revine!).
  4. Clasa Elev, partea a doua. Adaugă-i metoda __str__(self) care returnează "Maria — media 9.5". Pune cei 3 elevi într-o listă și afișează-i cu for e in catalog: print(e).
Provocare bonus: salvează catalogul în catalog.txt (Modulul 09), apoi citește-l înapoi și RECONSTRUIEȘTE obiectele din fiecare linie. Rezolvarea completă e în capitolul 7 din fișierul Python al lecției.
Puntea către C++: în Python ai grupat date + acțiuni într-o CLASĂ. În C++, echivalentul care grupează mai multe date sub un nume este struct — chiar tipul cerut la BAC. Îl înveți în modulul următor, 11a.
← anteriorModul 09 · Fișiere text urmează →Modul 10a · Tipul struct (C++)