Curs 2 - Agregare și Compunere, Moștenire, Polimorfism și Abstractizare în Python

Acest curs detaliază relațiile dintre clase, moștenirea, polimorfismul și abstractizarea în Python.

1. Agregare și Compunere

Agregarea și compunerea sunt două tipuri de relații între clase. În compunere, obiectul deține exclusiv instanțele altor clase, iar în agregare, instanțele pot exista independent.

a) Compunerea în Python

class Motor:
    def __init__(self, putere):
        self.putere = putere

class Masina:
    def __init__(self, marca, putere_motor):
        self.marca = marca
        self.motor = Motor(putere_motor) # Obiectul Motor este creat în interior

masina1 = Masina("Dacia", 90)
print(f"Masina {masina1.marca} are un motor de {masina1.motor.putere} CP.")

b) Agregarea în Python

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

class Masina:
    def __init__(self, marca, sofer):
        self.marca = marca
        self.sofer = sofer  # Referință către un obiect existent

sofer1 = Sofer("Ion")
masina1 = Masina("Toyota", sofer1)
print(f"Masina {masina1.marca} este condusă de {masina1.sofer.nume}.")

2. Moștenirea

Moștenirea permite unei clase să preia atribute și metode dintr-o altă clasă.

a) Moștenire Simplă

class Animal:
    def sunet(self):
        return "Sunet generic"

class Caine(Animal):
    def sunet(self):
        return "Ham ham!"

caine1 = Caine()
print(caine1.sunet())

b) Moștenire Multiplă

class Mamifer:
    def caracteristica(self):
        return "Are sânge cald"

class Carnivor:
    def tip_alimentatie(self):
        return "Se hrănește cu carne"

class Leu(Mamifer, Carnivor):
    pass

leu1 = Leu()
print(leu1.caracteristica())
print(leu1.tip_alimentatie())

3. Polimorfism

Polimorfismul permite utilizarea aceleiași metode în clase diferite.

a) Polimorfism prin Suprascrierea Metodelor

class Pasare:
    def zboara(self):
        return "Unele păsări pot zbura."

class Vultur(Pasare):
    def zboara(self):
        return "Vulturul zboară sus."

class Pinguin(Pasare):
    def zboara(self):
        return "Pinguinii nu pot zbura."

pasari = [Vultur(), Pinguin()]
for pasare in pasari:
    print(pasare.zboara())

b) Polimorfism prin Metode Generale

class Forma:
    def arie(self):
        pass

class Cerc(Forma):
    def __init__(self, r):
        self.r = r
    def arie(self):
        return 3.14 * self.r ** 2

class Dreptunghi(Forma):
    def __init__(self, l, L):
        self.l = l
        self.L = L
    def arie(self):
        return self.l * self.L

forme = [Cerc(5), Dreptunghi(4, 6)]
for forma in forme:
    print(forma.arie())

4. Abstractizare

Abstractizarea se face folosind clasa `ABC` și metoda `@abstractmethod` pentru a impune implementarea metodelor în clasele derivate.

a) Definirea unei Clase Abstracte

from abc import ABC, abstractmethod

class Vehicul(ABC):
    @abstractmethod
    def porneste(self):
        pass

class Masina(Vehicul):
    def porneste(self):
        return "Motorul mașinii a pornit."

class Bicicleta(Vehicul):
    def porneste(self):
        return "Bicicleta nu are motor, începe să pedalezi."

vehicule = [Masina(), Bicicleta()]
for vehicul in vehicule:
    print(vehicul.porneste())

Resurse suplimentare: