Curs Web Development
Curs HTML
Curs CSS
Curs Javascript
Curs PHP
Curs Phyton
Curs SQL
Curs SEO

Programare Orientată pe Obiecte (OOP)

Clase și Obiecte în Python

Programarea orientată pe obiecte (OOP) este un stil de programare care organizează codul în jurul „obiectelor” — instanțe ale unor clase. O clasă definește structura și comportamentul, iar obiectele sunt instanțe concrete ale acestei structuri.

Definirea unei clase

class Elev:
    pass

Crearea unui obiect

ioan = Elev()
print(type(ioan))   # Afișează: <class '__main__.Elev'>
Observație:
  • O clasă este un tip de date definit de utilizator.
  • Obiectele sunt instanțe ale claselor și pot avea atribute și metode proprii.
  • Prin OOP, codul devine mai modular, reutilizabil și ușor de întreținut.

Constructorul __init__ în Python

Metoda __init__ este constructorul unei clase în Python. Ea este apelată automat atunci când se creează un obiect și permite inițializarea atributelor.

Definirea unui constructor

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

Crearea unui obiect cu constructor

ioan = Elev("Ioan", 17)
print(ioan.nume)     # Afișează: Ioan
print(ioan.varsta)   # Afișează: 17
Observație:
  • self este o referință la instanța curentă a clasei.
  • Constructorul poate primi oricâți parametri, în funcție de ce vrei să inițializezi.
  • Fără __init__, obiectul se creează dar nu are atribute definite.

Atribute și Metode în Python

Atributele sunt variabile asociate unui obiect, iar metodele sunt funcții definite în cadrul unei clase. Ele definesc starea și comportamentul obiectelor.

Atribute de instanță

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

ioan = Elev("Ioan", 17)
print(ioan.nume)     # Afișează: Ioan

Metode de instanță

class Elev:
    def __init__(self, nume):
        self.nume = nume

    def salut(self):
        print(f"Salut, eu sunt {self.nume}!")

ioan = Elev("Ioan")
ioan.salut()   # Afișează: Salut, eu sunt Ioan!
Observație:
  • Atributele definesc starea unui obiect.
  • Metodele definesc comportamentul și pot accesa atributele prin self.
  • Poți modifica atributele direct: ioan.varsta = 18.

Moștenire și Polimorfism în Python

Moștenirea permite unei clase să preia comportamentul și atributele altei clase. Polimorfismul permite folosirea acelorași metode în moduri diferite, în funcție de contextul obiectului.

Moștenirea unei clase

class Persoana:
    def __init__(self, nume):
        self.nume = nume

    def salut(self):
        print(f"Salut, eu sunt {self.nume}")

class Elev(Persoana):
    def salut(self):
        print(f"Elevul {self.nume} spune bună ziua!")

Polimorfism

pers = Persoana("Ana")
elev = Elev("Ioan")

pers.salut()   # Salut, eu sunt Ana
elev.salut()   # Elevul Ioan spune bună ziua!
Observație:
  • Moștenirea se face prin paranteze: class Subclasa(ClasaDeBază).
  • Metodele pot fi suprascrise în subclasă pentru comportament personalizat.
  • Polimorfismul permite tratarea obiectelor diferite prin aceeași interfață.

Encapsulare și Proprietăți în Python

Encapsularea este principiul OOP care protejează datele interne ale unui obiect. În Python, putem controla accesul la atribute folosind convenții și proprietăți.

Atribute private (convenție)

class Elev:
    def __init__(self, nume):
        self._nume = nume   # convenție: atribut „protejat”
        self.__cod = 1234   # atribut „privat” (name mangling)

Acces controlat cu proprietăți

class Elev:
    def __init__(self, nume):
        self._nume = nume

    @property
    def nume(self):
        return self._nume

    @nume.setter
    def nume(self, valoare):
        if valoare:
            self._nume = valoare

ioan = Elev("Ioan")
print(ioan.nume)     # Afișează: Ioan
ioan.nume = "Andrei"
print(ioan.nume)     # Afișează: Andrei
Observație:
  • Atributele cu _ sau __ nu sunt complet private, dar semnalează intenția de protecție.
  • Decoratoarele @property și @setter permit controlul asupra citirii și modificării atributelor.
  • Encapsularea ajută la menținerea integrității datelor și la ascunderea detaliilor interne.

Metode speciale (dunder methods) în Python

Metodele speciale, cunoscute și ca „dunder methods” (double underscore), permit definirea comportamentului personalizat al obiectelor în contexte uzuale: afișare, lungime, adunare etc. Ele încep și se termină cu două caractere underscore.

__str__ - afișare textuală

class Elev:
    def __init__(self, nume):
        self.nume = nume

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

ioan = Elev("Ioan")
print(ioan)   # Afișează: Elev: Ioan

__len__ - lungimea obiectului

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

    def __len__(self):
        return len(self.membri)

g = Grup(["Ioan", "Ana", "Mihai"])
print(len(g))   # Afișează: 3

__add__ - comportamentul operatorului +

class Elev:
    def __init__(self, nume):
        self.nume = nume

    def __add__(self, altul):
        return f"{self.nume} și {altul.nume} sunt colegi"

e1 = Elev("Ioan")
e2 = Elev("Ana")
print(e1 + e2)   # Afișează: Ioan și Ana sunt colegi
Observație:
  • Metodele speciale permit integrarea naturală a obiectelor în expresii Python.
  • __str__ este folosit de print() pentru afișare.
  • __len__ permite folosirea funcției len() pe obiecte personalizate.
  • __add__ definește cum se comportă obiectele la adunare cu +.

🧠 Quiz - Programare Orientată pe Obiecte (OOP)

Top