Ce vei învăța astăzi?
După această lecție vei înțelege ce este o clasă (tip de date care descrie o structură), ce este un obiect (realizare concretă a unei clase, numită și instanță), cum instanțiem (creăm obiecte prin apelarea clasei) obiecte și cum accesăm membrii (datele și metodele) lor cu punctul.
Clasa și obiectul
O clasă este un tip de date care descrie o structură (predefinită sau definită de utilizator). Un obiect este o instanță a unei clase, adică o realizare concretă a ei.
Analogie:
Clasa este ca un plan de casă: descrie cum arată. Obiectul este casa construită după plan: concretă, folosibilă. Dintr-un singur plan putem construi multe case, adică multe obiecte.
Membrii unei clase sunt datele (atributele) și metodele (acțiunile) ei. De exemplu, un obiect list are date (elementele) și metode (append, sort, reverse).
Clase predefinite și instanțiere
Python are multe clase predefinite, deja construite: list, int, str, iar în biblioteca tkinter clasele Tk, Label, Button, Entry.
v = [3, 1, 2] # v este un obiect al clasei list v.append(4) # apelăm metoda append print(v) v.sort() # metoda sort print(v) v.reverse() # metoda reverse print(v)
Observă: obiectul v se creează prin apelarea clasei list. Metodele se apelează cu punctul: v.append(4).
Instanțierea și accesul cu punctul
Instanțierea înseamnă crearea unui obiect prin apelarea clasei. Pentru clasa list scriem v = [1, 2, 3] sau v = list(). Pentru o fereastră Tk: f = Tk(). Accesăm membrii obiectului cu punctul: obiect.membru.
from tkinter import *
f = Tk() # f este un obiect al clasei Tk
f.title("Fereastra mea") # accesăm metoda title
eticheta = Label(f, text="Salut") # obiect al clasei Label
eticheta.pack()
f.mainloop()
Reține: Label(f, text="Salut") instanțiază un obiect Label, iar eticheta.pack() apelează metoda lui pack. Punctul leagă obiectul de membrii lui.
Exercițiu de completare
Completează enunțul cu cuvintele potrivite:
Un tip de date care descrie o structură se numește ______. Un ______ este o realizare concretă a clasei, numită și ______. Membrii unui obiect se accesează cu ______ (punctul).
Bancă de cuvinte:
Test de înțelegere
Test rapid - programarea orientată pe obiecte:
1. Un obiect este:
2. Accesăm metoda unui obiect folosind:
3. Care este rezultatul codului v = [1, 2, 3]; v.append(4); print(v)?
Test suplimentar
Test suplimentar - programarea orientată pe obiecte:
1. O clasă se definește cu cuvântul cheie:
2. Constructorul unei clase în Python este metoda:
3. Într-o metodă, parametrul self reprezintă:
Aprofundare
Aliasing (alias): scrierea v2 = v1 nu copiază lista; ambele nume indică același obiect. O modificare prin v2 se vede și în v1. Pentru o copie reală folosim v1.copy() sau v1[:].
- Metode care modifică versus metode care întorc valori:
v.append(4)șiv.sort()modifică obiectul și întorc None, deci nu pot fi puse în print. Metodele clasei str (upper, replace) întorc obiecte noi, fără a modifica șirul original. - Verificarea tipului:
type(x)întoarce clasa obiectului, iarisinstance(x, list)verifică dacă x este obiect al clasei list. - Explorarea clasei:
dir(list)listează metodele clasei, iarhelp(list)arată documentația lor. - Obiecte imuabile: numerele și șirurile sunt imuabile - orice operație întoarce un obiect nou, originalul rămâne neatins.
- Caz particular: chiar și
printeste o funcție care primește obiecte; print întoarce None, de aceea nu are rost să scriem print(print(...)).
PbInfo - Metode pe obiecte list
Enunț:
Cerință: Se citește o listă de numere. Folosind obiectul list și metodele sale (sort, append, reverse), să se sorteze lista, să se adauge valoarea 99 la final, să se inverseze lista și să se afișeze rezultatul.
Date de intrare:
Programul citește de la tastatură elementele listei, pe o singură linie.
Date de ieșire:
Programul va afișa lista sortată, cu 99 adăugat la final și inversată.
Restricții și precizări:
Valorile citite sunt numere întregi, iar n este un număr natural, cu 1 <= n <= 1000.
Exemplu:
Intrare:
5 3 8 1
Ieșire:
99 8 5 3 1
Cum gândim soluția:
- Citim lista și o salvăm în obiectul v
- Sortăm obiectul cu v.sort()
- Adăugăm 99 cu v.append(99) și inversăm cu v.reverse()
- Afișăm cu print(*v)
Scrie soluția în Python:
Soluție corectă:
v = [int(x) for x in input().split()] v.sort() v.append(99) v.reverse() print(*v)
Ce învățăm: obiectul v al clasei list are metode predefinite pe care le apelăm cu punctul.
PbInfo - Obiecte din clasa list
Enunț:
Cerință: Se citește o listă de numere, apoi o valoare x. Folosind obiectul v și metoda count, să se afișeze de câte ori apare x în listă.
Date de intrare:
Programul citește elementele listei, apoi valoarea x, pe linii separate.
Date de ieșire:
Programul va afișa numărul de apariții ale lui x în listă.
Restricții și precizări:
Valorile citite sunt numere întregi, iar n este un număr natural, cu 1 <= n <= 1000.
Exemplu:
Intrare:
3 1 3 4 3 3
Ieșire:
3
Cum gândim soluția:
- Citim lista și o salvăm în obiectul v
- Citim valoarea x
- Folosim metoda v.count(x) pentru a număra aparițiile
- Afișăm rezultatul
Scrie soluția în Python:
Soluție corectă:
v = [int(x) for x in input().split()] x = int(input()) print(v.count(x))
Ce învățăm: metoda count face parte din clasa list și numără aparițiile unei valori în obiect.
Exercițiul Practic: Obiecte și metode
Sarcini de lucru
Lucrează cu obiecte din clasele list și tkinter
Sarcina 1: Obiect list cu append
Cerință: Scrie un program care creează un obiect list gol, adaugă 5 valori citite de la tastatură cu metoda append, apoi afișează numărul de elemente (len) și suma lor (sum), folosind obiectul.
Soluție:
v = []
for i in range(5):
n = int(input())
v.append(n)
print("Numar elemente:", len(v))
print("Suma:", sum(v))
Verifică: v este un obiect al clasei list, iar append adaugă câte un element la fiecare iterație.
Sarcina 2: Mini-aplicație Tkinter cu obiecte
Cerință: Construiește o aplicație Tkinter în care obiectele (Label, Entry, Button) sunt definite separat, iar butonul citește textul din Entry cu get() și îl afișează în MessageBox.
Soluție:
from tkinter import *
from tkinter import messagebox
fereastra = Tk()
eticheta = Label(fereastra, text="Numele tau:")
caseta = Entry(fereastra)
eticheta.pack()
caseta.pack()
def afiseaza():
messagebox.showinfo("Mesaj", caseta.get())
buton = Button(fereastra, text="Saluta-ma", command=afiseaza)
buton.pack()
fereastra.mainloop()
Verifică: eticheta, caseta și butonul sunt obiecte ale claselor Tkinter, iar butonul apelează funcția care citește Entry-ul.