Acest curs detaliază relațiile dintre clase, moștenirea, polimorfismul și abstractizarea în Python.
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.
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.")
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}.")
Moștenirea permite unei clase să preia atribute și metode dintr-o altă clasă.
class Animal:
def sunet(self):
return "Sunet generic"
class Caine(Animal):
def sunet(self):
return "Ham ham!"
caine1 = Caine()
print(caine1.sunet())
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())
Polimorfismul permite utilizarea aceleiași metode în clase diferite.
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())
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())
Abstractizarea se face folosind clasa `ABC` și metoda `@abstractmethod` pentru a impune implementarea metodelor în clasele derivate.
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())