Denis Petriceanu - Python
Denis Petriceanu - Python
Rechizite ................................................................................................................ 6
Constructori ............................................................................................................. 32
2
Destructori............................................................................................................... 34
Polimorfismul .......................................................................................................... 37
Incapsularea ............................................................................................................ 39
Exceptii ................................................................................................................... 42
This ......................................................................................................................... 44
Bibliografie: ............................................................................................................ 45
3
Introducere in POO
Desigur, functiile isi au limitele lor. Ele nu stocheaza informatii cum ar fi valorile
variabilelor, ceea ce inseamna ca de fiecare data cand este rulata, o functie incepe de la zero.
Atunci, ce se intampla daca anumite functii si variabile se afla in stransa legatura si trebuie sa
interactioneze destul de mult?
Obiectele din lumea reala au doua caracteristici: stare si comportament. Lupii au stare
(nume, culoare, rasa, le este foame) si comportament (urla, alearga, vaneaza). Si masinile au
stare (trepte de viteza, marime, frane) si comportament (schimbarea vitezei, virarea, aplicarea
franei).
4
Identificarea starii si a comportamentului in cazul obiectelor reale reprezinta o metoda
minunata de a incepe sa gandesti in termenii programarii orientate pe obiecte. Obiectele
software sunt din punct de vedere conceptual similare obiectelor lumii reale: si acestea au
stare si comportament. Un obiect isi pastreaza starea in campuri (variabile in anumite limbaje
de programare) si isi expun comportamentul prin metode (functii in anumite limbaje de
programare). Metodele opereaza asupra starii interne a unui obiect si servesc ca mecanism
primar in cazul comunicarii de la obiect la obiect.
OOP modelează entități din lumea reală ca obiecte software unele date asociate cu
acestea și pot efectua anumite funcții.
paradigma care se potrivește cel mai bine problemei, combinați diferite paradigme într-un
evoluează.
5
Introducere in Python
Rechizite
Un Python!
Dacă încă nu ai Python, cele mai recente pachete de instalare sunt disponibile aici:
http://python.org/download/ . Este de preferat Python 3, aceasta fiind cea mai nouă versiune!
Nota:
Pe platforme Windows, poți să adaugi Python la calea ta, astfel încăt să poată fi găsit
de alte programe. Pentru a face asta, mergi în directorul tău de instalare (C:\Python33\),
dublu clic.
Și un editor
Un editor te ajută să citești și să scrii cod. Există foarte multe, și acesta este una dintre
cele mai personale alegeri pe care le poate face un programator - ca un jucător de tenis care
își alege racheta, sau ca un bucătar șef care își alege cuțitul preferat. Pentru început, o să vrei
doar un editor simplu, ușor de utilizat și care nu te încurcă, dar este totuși eficient la scrierea
acestuia Ctrl+B îți permite să execuți imediat fișierul Python la care lucrezi.
gestiune a pachetelor).
TextMate: Unul dintre cele mai faimoase editoare pentru Mac, a fost un produs
Gedit and Kate: dacă dorești să folosești Linux cu Gnome și respectiv KDE,
Komodo Edit: un editor strălucit, gratuit pentru Mac, Windows și Linux, bazat
Sigur ca acestea nu sunt toate editoarele pe care le poti folosi pentru a programa in Python.
De exemplu: eu folosesc Eclipse, acesta este un IDE puternic. Pentru a utiliza Python pe acest
IDE ai nevoie de mai multe setari; am sa incerc sa enumar pasii intr-un mod cat mai succint
posibil:
Dupa ce ai descarcat, da-i run si instaleaza-l. Acest pas se face usor, se instaleaza in
Acum va trebuie sa descarci PyDev din Eclipse, pentru asta mergi la: Help -> Install
New Software
Dupa cateva secunde doua optiuni vor aparea. Selecteaza PyDev for Eclipse. Nu
7
Acceptati termenii si conditiile
Cand va fi afisata caseta „Selection Nedeed” va trebui sa bifati singur Aptana Pydev
Asta este tot, tocmai ce ati configurat cu SUCCES IDE-ul pentru a putea programa in
Python.
tipul. Fiecare variabilă din Python este un obiect și, prin urmare, fiecare obiect suportă
următoarele funcții:
membrii
8
Numerele sau variabilele de tip Integer
a= 1
b = 1.653
c = 9 - 7j
Nu există limită pentru lungimea întregilor. Pot fi oricât de lungi vreţi (trebuie
doar să aveţi destulă memorie).
Boolean
orice context boolean (expresiile de la care Python aşteaptă o valoare booleană, adevarat sau
fals).
Valorile nenule sunt considerate True, iar cele nule sunt considerate False.
Din acest motiv, practic orice expresie poate fi folosită într-un context boolean.
9
Șiruri
Tot ce apare între o pereche de citate unice sau duble este un șir.
myString = ”cuvant”
Diferența dintre cele două este simplă: folosind ghilimele duble pot introduce
apostroful ceea ce nu aș putea face dacă aș fi folosit citate simple deoarece apostroful nu ar fi
Cativa Operatori
a=1
b=2
c=a+b
o stringHello = "hello"
o stringWorld = "world"
Liste
Listele sunt similare vectorilor sau mulțimilor. Pot conține orice tip de variabilӑ/-e, iar
numӑrul elementelor pe care ȋl conțin este variabil și nerestrictiv. Listele pot fi de asemenea
iterate ȋntr-o manierӑ foarte simplӑ, dupӑ cum este prezentat ȋn exemplul de mai jos:
10
listaMea = []
Output:
listaMea.append(1)
listaMea.append("paine") 1
listaMea.append(2) Paine
listaMea.append("mere")
print(listaMea[0])
print(listaMea[1])
In acest caz atat adaugarea cat si afisarea s-a facut manual, dar aceasta se poate
Aplicarea unui for la afisare pentru aceliasi lista. Sau mai jos a unui while:
i = 0
Output:
while i < len(listaMea): 1
paine
print(listaMea[i]) 2
mere
i += 1
11
Metode predefinite utile ȋn lucrul cu liste
12
Clase în Python
Concentrându-se mai întâi pe date, fiecare lucru sau obiect este o instanță a unei
anumite clase .
și liste, sunt concepute să reprezinte lucruri simple, cum ar fi costul unui produs, numele unui
De exemplu, să presupunem că ați vrut să urmăriți mai multe animale diferite. Dacă
ați folosit o listă, primul element ar putea fi numele animalului, în timp ce al doilea element
De unde ar ști cine ar trebui să fie elementul? Dacă ai avea 100 de animale diferite? Esti
sigur ca fiecare animal are atat un nume si o varsta, si asa mai departe? Dacă ați vrea să
Clasele sunt folosite pentru a crea noi structuri de date definite de utilizator care conțin
informații arbitrare despre ceva. În cazul unui animal, am putea crea o clasă Animal()
Este important să rețineți că o clasă oferă doar o structură - este un plan pentru modul
în care ar trebui definit ceva, dar nu oferă în realitate nici un conținut real. Clasa Animal()
poate specifica faptul că numele și vârsta sunt necesare pentru definirea unui animal.
Ar putea ajuta la gândirea unei clase ca o idee pentru cum ar trebui definit ceva.
13
Obiecte Python (instanțe)
În timp ce clasa este planul, o instanță este o copie a clasei cu valori reale ,
literalmente un obiect aparținând unei clase specifice. Nu mai este o idee; este un animal real,
necesare. După ce completați formularul, copia dvs. specifică este o instanță a clasei; conține
Puteți să completați mai multe copii pentru a crea mai multe instanțe diferite, dar fără
ca un formular ca ghid, s-ar fi pierdut, fără a ști ce informații sunt necesare. Astfel, înainte de
a crea instanțe individuale ale unui obiect, trebuie să specificăm mai întâi ce este necesar
definind o clasă.
class caine:
pass
Începeți cu class, cuvântul cheie pentru a indica faptul că creați o clasă, apoi
De asemenea, am folosit cuvântul cheie Python pass aici. Acest lucru este foarte
adesea folosit ca un titular de loc în cazul în care codul va merge în cele din urmă. Aceasta ne
14
Notă: Codul de mai sus este corect pentru Python 3. Pe Python
diferită:
(obiect)Partea din paranteze specifică clasa părinte pe care o moștenește (mai multe
despre acest lucru mai jos). În Python 3 acest lucru nu mai este necesar, deoarece este
implicit.
Atribuiri de instanță
Toate clasele creează obiecte și toate obiectele conțin caracteristici numite atribute
deschidere). Utilizați __init__()metoda pentru a inițializa atributele inițiale ale unui obiect
prin acordarea valorii lor implicite (sau a stării). Această metodă trebuie să aibă cel puțin un
argument, precum și variabila self, care se referă la obiectul însuși (de exemplu, câine).
class caine:
def __init__ (self, nume, varsta):
self.nume = nume
self.varsta = varsta
15
În cazul clasei caine(), fiecare câine are un nume și o anumită vârstă, ceea ce este
Amintiți-vă: clasa este doar pentru definirea câinelui, care nu creează de fapt cazuri de
câini individuali cu nume și vârste specifice; vom ajunge la asta în scurt timp.
exemplele unei clase au valori diferite, am putea spune caine.nume = nume mai degrabă
decât self.nume = nume. Dar, deoarece nu toți câinii au același nume, trebuie să putem
atribui diferite valori instanțelor diferite. Prin urmare, este nevoie de variabila self specială,
aceleași pentru toate instanțele - care în acest caz sunt toți câinii.
class caine:
# clasa atribut
specie = "mamifer"
# instanta
16
def __init__ (self, nume, varsta):
self.nume = nume
self.varsta = varsta
Deci, în timp ce fiecare câine are un nume unic și vârstă, fiecare câine va fi un mamifer.
Obiecte instante
Instantiere este un termen fantezist pentru crearea unei instanțe noi, unice a unei clase.
De exemplu:
class caine:
pass
# instantiere
caine()
caine()
a = caine()
b = caine()
if a == b:
print("True")
else:
print("False")
17
Am început să definim o nouă clasa caine(), apoi am creat doi câini noi, fiecare
atribuit unor obiecte diferite. Deci, pentru a crea o instanță a unei clase, folosiți numele clasei,
urmat de paranteze. Apoi, pentru a demonstra că fiecare instanță este de fapt diferită, am
instanțiat încă doi câini, atribuindu-le fiecărei variabile, apoi testat dacă aceste variabile sunt
egale.
class caine:
pass
a = caine()
print(type(a))
out:
<class '__main__.caine'>
class caine:
specie = 'mamifer'
rex = caine("Rex", 2)
max = caine("Max", 3)
18
print("Cainele cu numele: " + max.nume + " are varsta de " + format(max.varsta) + "
ani.")
print("Cainele cu numele: " + rex.nume + " are varsta de " + format(max.varsta) + "
ani.")
if max.specie == "mamifer":
NOTĂ : Observați cum folosim notația punctului pentru a accesa atributele din fiecare
obiect.
Ce se întâmplă?
Am creat o nouă instanță a clasei caine() și l-am atribuit variabilei rex. Apoi i-am
dat două argumente "Rex" și 2, care reprezintă numele și vârsta câinelui respectiv.
Aceste atribute sunt transmise metodei __init__, care se numește oricând creați o
instanță nouă, atașând numele și vârsta la obiect. S-ar putea să te întrebi de ce nu trebuia să
19
Aceasta este magia Python; când creați o nouă instanță a clasei, Python determină
automat ceea ce este self (un câine în acest caz) și îl transmite __init__ metodei.
Metode de instanță
Metodele de instanță sunt definite în interiorul unei clase și sunt utilizate pentru a
obține conținutul unei instanțe. Ele pot fi, de asemenea, folosite pentru a efectua operațiuni
întotdeauna self:
class caine:
specie = 'mamifer'
rex = caine("Rex", 2)
max = caine("Max", 3)
print(rex.descriere())
print("Cainele cu numele: " + rex.nume + " are varsta de " + format(max.varsta) + "
ani.")
print(max.sunete("hamHam"))
20
if max.specie == "mamifer":
comportamente ați putea atribui unui câine? Poti sa implementezi mai multe exemple din
aceasta categorie.
Modificarea atributelor
Puteți modifica valoarea atributelor pe baza unor comportamente:
class mesaj:
def __init__(self):
self.mesaj = False
print(self.mesaj)
self.mesaj = True
print(self.mesaj)
21
mesajul = mesaj()
print(mesajul.trimitere())
False
True
Mesaj trimis
Moștenirea este procesul prin care o clasă preia atributele și metodele alteia. Clasele
nou formate sunt numite clasa copil, iar clasele la care sunt derivate clasele copil sunt
Este important să rețineți că clasele de copii suprascriu sau extind funcționalitatea (de
exemplu, atributele și comportamentele) ale clasei părinților. Cu alte cuvinte, clasele copil
comportamentul diferit de urmat. Cel mai de bază tip de clasă este un obiect, care, în
22
Când definiți o nouă clasă, Python 3 se folosește implicit obiect ca clasă
treci
clasa caine:
treci
Notă: în Python 2.x există o distincție între clasele de stil nou și vechi . Nu
voi intra în detaliu aici, dar în general veți dori să specificați objectca clasă părinte
pentru a vă asigura că definiți o clasă de stil nou dacă scrieți codul Python 2 OOP.
Exemplu
Să presupunem că suntem la un parc de câini. Există mai multe obiecte de câine care
alergă, în timp ce unii se întind și alții doar urmăresc alți câini. În plus, fiecare câine a fost
Care este un alt mod de a diferenția un câine de altul? Ce zici de rasa câinelui:
class caine:
self.nume = nume
self.rasa = rasa
23
print(" {0} este de rasa {1}" .format(self.nume, self.rasa))
Dupa rulare:
Fiecare rasă de câine are comportamente ușor diferit. Pentru a ține cont de acestea, să
creăm clase separate pentru fiecare rasă. Acestea sunt clase părinte ale clasei caine,
clasa părinte.
# clasa parinte
class caine:
specie = 'mamifer'
self.nume = nume
self.rasa = rasa
# clasa copil
class ciobanesc(caine):
# clasa copil
self.kg = kg
max.descriere()
max.vorbeste("hahaham")
print()
rex.vorbeste("hamham")
25
rex.greutate('12')
Citiți comentariile cu voce tare pe măsură ce lucrați prin acest program pentru a vă
ajuta să înțelegeți ce se întâmplă, apoi, înainte de a rula programul, vedeți dacă puteți anticipa
rezultatul așteptat.
Rex cantareste 12
Dupa cum se observa clasa lup care mosteneste clasa parinte: caine, are o alta metoda
metoda si anume metoda greutate. Clasa copil se poate folosi atat de metodele din clasa
# clasa parinte
26
class caine:
specie = 'mamifer'
self.nume = nume
self.rasa = rasa
# clasa copil
class ciobanesc(caine):
self.viteza = viteza
self.viteza))
27
# clasa copil
self.kg = kg
max.descriere()
max.vorbeste("hahaham")
print()
rex.vorbeste("hamham")
rex.greutate('12')
campion.alearga('10')
print(isinstance(campion, ciobanesc))
Output:
True
print(isinstance(caine, rex))
Are sens? Caine este clasa parinte, iar rex este o instanta a clasei lup, clasa lup fiind
clasa copil a clasei caine. E norma sa nu functioneze si sa afiseze o eroare, deoarece rex nici
macar nu este o clasa, iar functia isinstance asteapta ca unul dintre argumente sa fie clasa, sau
parentală. De exemplu:
29
class caine:
specie = 'mamifer'
self.nume = nume
class lup(caine):
class ciobanesc(caine):
specie = 'oviparitate'
rex = caine('Rex')
print(rex.descriere())
gonzales = lup('Gonzales')
print(gonzales.descriere())
campion = ciobanesc('Campion')
30
print(campion.descriereCiob())
Afisare:
Mostenirea Multipla
Dacă în tuplul de moștenire este listată mai mult de o clasă, acest caz este de moştenire
multiplă.
În cele mai simple cazuri, vă puteți gândi la căutarea atributelor moștenite de la o clasă
parinte de la stânga la dreapta, fără a căuta de două ori în aceeași clasă în cazul în care există
o suprapunere în ierarhie. Astfel, dacă un atribut nu este găsit, acesta este căutat în prima
class A:
def afiseaza(self):
print("Am gasit metoda!")
31
class B:
pass
obiect = C()
obiect.citeste('Mihai')
obiect.afiseaza()
Output:
Am gasit metoda!
Constructori
constructorilor este de a inițializa (atribuie valori) membrilor de date din clasă atunci când
este creat un obiect de clasă. În Python, metoda __init __ () este numită constructor și este
Definitie: La instantierea unui obiect se apeleaza constructorul. Dar acesta are nevoie
clasei.
32
Sintaxa:
Tipuri de constructori:
acceptă niciun argument. Definiția lui are doar un singur argument, care este o
class A:
def __init__(self):
print("Constructor A")
class B:
def __init__(self):
print("Constructor B")
a = A()
33
b = B()
Output:
Constructor A
Constructor B
Destructori
atunci când toate trimiterile la obiect au fost șterse, adică atunci când un obiect este
colectat de gunoi.
Notă: Distructorul a fost chemat după terminarea programului sau când toate
referințele la obiect sunt șterse, adică când numărul de referință devine zero, nu când obiectul
class A:
def __init__(self):
34
print("Constructorul A s-a apelat!\n")
class B:
def __init__(self):
print("Constructorul B s-a apelat!\n")
def __del__(self):
print("Destructorul B s-a apelat!")
b = B()
b.faCeva()
a = A()
a.faCeva()
Output:
35
Constructorul B s-a apelat!
Rezultat: 2.5
Rezultat: 1.0
Acest modul oferă o interfață pentru colectorul opțional de gunoi. Oferă posibilitatea
depanare. Oferă, de asemenea, acces la obiecte nedovedite pe care colectorul le-a găsit, dar
în Python, puteți dezactiva colectorul dacă sunteți sigur că programul dvs. nu creează cicluri
pentru inspecție.
36
class A:
def __init__(self):
B.__init__(self)
class B(A):
def __init__(self):
A.__init__(self)
ob = B()
print(ob.aduna(1, 2))
print(ob.aduna(1, 2, 3))
Output:
…
…
…
B.__init__(self)
File "E:\Eclipse\ForHomeWork\src\test2.py", line 7, in __init__
A.__init__(self)
File "E:\Eclipse\ForHomeWork\src\test2.py", line 3, in __init__
B.__init__(self)
RecursionError: maximum recursion depth exceeded
Polimorfismul
37
print(len("numele"))
Output:
print(aduna(1, 2))
print(aduna(1, 2, 3))
Output:
class A:
def __init__(self):
print("Clasa A")
38
def aduna(self, x, y, z=0):
return x+y+z
class B(A):
def __init__(self):
print("Clasa B")
ob = B()
print(ob.aduna(1, 2))
print(ob.aduna(1, 2, 3))
ob1 = A()
print(ob1.aduna(1, 2))
print(ob1.aduna(1, 2, 3))
nume ca și metodele din clasa parinte. În moștenire, clasa copil moștenește metodele din clasa
părinte. Cu toate acestea, este posibil să modificați o metodă într-o clasă copil pe care a
moștenit-o de la clasa parinte. Acest lucru este deosebit de util în cazurile în care metoda
Incapsularea
39
__member - prefixarea cu două underscore-uri, pentru membri private, interzice accesul
class Elev:
__clasa = 11
self.__nume = nume
self.__medie = medie
self.__nume = nume;
def get_nume(self):
ob = Elev("Mihai", '9.80')
ob.afisare()
ob.set_nume("Ion")
ob.get_nume()
ob.afisare()
print(ob.__clasa)
Output:
40
Mihai are media 9.80
print(ob.__clasa)
Python protejează membrii privați prefixându-le numele cu numele clasei din care fac
nu restricționând complet accesul. În exemplul de mai sus, se poate accesa membrul privat
astfel:
ob._Elev__clasa
În Python, membrii unei clase se pot schimba în timpul rulării (nu doar valoarea
In continuare va voi arata cateva exemple, printre care si adaugarea clasei A deja
definite un atribut y. Orice nouă instanță a clasei A va avea acest nou atribut.
class A:
ab = 0
41
def setx (self, x):
self.x = x
f = A()
# se poate adauga
f.setx(2)
print(f.x)
A.y = 10
print(f.y)
# se poate sterge
del f.x
print(f.x)
Exceptii
O exceptie este o eroare care apare atunci cand un program ruleaza si care are drept
consecinta oprirea lui brutala. Pentru manuirea exceptilor se foloseste blocul de declaratii
try/except.
class A:
ab = 0
42
def setx (self, x):
self.x = x
f = A()
# se poate adauga
f.setx(2)
print(f.x)
A.y = 10
print(f.y)
# se poate sterge
del f.x
try:
print(f.x)
except:
print("Eroare")
Output: 2
10
Eroare\
Erori care apar in Python: (tabel preluat din cartea „Cum sa programezi in
Python, Mircea Prodan, 2014)
Exceptii Descriere
AssertionError Apare atunci cand declaratia esueaza
AttributeError Atributul nu este gasit in obiect
EOFError Cand se incearca citirea dincolo de sfarsitul unui
fisier
FloatingPointError Apare cand operatia cu un numar in virgula mobila
esueaza
IOError Cand o operatie I/O esueaza
IndexError Cand se foloseste un index aflat in afara gamei
(range)
KeyError Cand o cheie nu este gasita
OSError Cand invocarea unui sistem de operare esueaza
OverflowError Cand o valoarea este prea mare ca sa poata fi
reprezentata
43
TypeError Cand un argument de un tip nepotrivit este furnizat
ValueError Cand valoarea unui argument nu este potrivita
ZeroDivisionError Cand un numar se imparte la zero ori cand al doilea
argument intr‑o operatie modulo este zero
This
Atat self cât și this sunt folosite pentru același lucru. Ele sunt folosite pentru a accesa
variabila asociată cu instanța curentă. Numai diferența este că trebuie să includeți self ,
explicit, ca prim parametru o metodă de instanță în Python, în timp ce acest lucru nu este cazul
cu Java. Mai mult, numele self poate fi orice. Nu este un cuvânt cheie, puteți chiar să o
schimbați this și va funcționa bine. Dar oamenilor le place să folosească self, așa ca a devenit
convenție.
class Persoana:
44
Bibliografie:
https://docs.python.org/3/library/gc.html
http://purepython.eaudeweb.ro/wiki/Cursuri/Programare-orientat%C4%83-pe-obiecte.html
https://github.com/eaudeweb/purepython/wiki/Programare-orientat%C4%83-pe-obiecte
https://stackoverflow.com
https://realpython.com
http://www.e-learn.ro
https://opentechschool.github.io
https://ocw.cs.pub.ro
45