12. Objektumorientált programozás (OOP)
Eddig a programjaink utasítások sorozatából álltak, amelyek fentről lefelé hajtódtak végre (ezt hívják procedurális programozásnak). Bár ezzel nagyon sok mindent meg lehet oldani, a valódi, modern szoftverfejlesztésben (legyen az egy videójáték, egy webáruház vagy egy mobilalkalmazás) egy teljesen más gondolkodásmódot használunk.
Ez az Objektumorientált programozás (Object-Oriented Programming, röviden OOP). Ennek a lényege, hogy a programunkat úgy építjük fel, ahogyan a valóságot is látjuk: objektumokból (dolgokból), amelyeknek vannak tulajdonságai és képességei.
12.1. Az alapfogalmak: Osztály és Objektum
Ahhoz, hogy megértsük az OOP-t, két fogalmat kell tisztáznunk, amiket sosem szabad összekeverni.
- Osztály (Class): Ez egy tervrajz vagy egy sablon. Képzelj el egy süteménykiszúró formát! Maga a forma nem ehető, csak megmondja, hogy milyennek kell lennie a süteménynek, ha majd elkészül.
- Objektum (Object / Példány): Ez a konkrét, kézzelfogható dolog, amit a tervrajz alapján létrehoztunk. Ez maga a megsütött sütemény. Egyetlen kiszúróval (Osztály) akár 100 darab süteményt (Objektumot) is készíthetünk!
| Osztály (A tervrajz) | Objektum (A konkrét dolog) |
|---|---|
| A ház tervrajza | A felépült ház a Petőfi utca 10-ben |
| Autó (általánosságban) | A te konkrét piros Fordod a garázsban |
| Diák (a kréta rendszerben) | Kovács Anna, 10.B osztályos tanuló |
12.2. Osztály létrehozása: A class kulcsszó
A Pythonban egy új sablont a class kulcsszóval hozunk létre. Nagyon fontos formázási szabály, hogy az osztályok nevét mindig Nagybetűvel kezdjük!
Amikor egy sablont megalkotunk, meg kell mondanunk, hogy milyen "kezdőcsomaggal" (tulajdonságokkal) rendelkezzen minden belőle készült objektum. Erre való az __init__ nevű különleges, beépített függvény (ezt hívjuk konstruktornak).
# Létrehozzuk a Kutya osztályt (a tervrajzot)
class Kutya:
# A konstruktor: Ez fut le automatikusan, amikor "megszületik" egy új kutya
def __init__(self, nev, kor):
self.nev = nev
self.kor = kor
self.fajta = "Keverék" # Alapértelmezett érték, amit mindenki megkap
Mi az a
self? Aself(angolul: önmaga) az OOP egyik legfontosabb szava. Ezzel az osztályon belül azt mondjuk a gépnek: "Az éppen most készülő konkrét objektum saját neve legyen az, amit paraméterként megkaptunk". Aself-et mindig kötelező elsőként beírni a zárójelekbe, de amikor később használjuk az osztályt, nem kell neki értéket adni, a Python ezt a háttérben automatikusan elintézi!
12.3. Objektumok (példányok) létrehozása és használata
Most, hogy megvan a tervrajz, "gyártsunk" belőle konkrét kutyákat! Egy objektum létrehozása olyan, mintha egy függvényt hívnánk meg az osztály nevével.
# Létrehozunk két konkrét objektumot (két különálló kutyát)
elso_kutya = Kutya("Bodri", 3)
masodik_kutya = Kutya("Rex", 5)
# A tulajdonságok lekérdezése a PONT (.) operátorral történik:
print(f"Az első kutya neve: {elso_kutya.nev}, és {elso_kutya.kor} éves.")
print(f"A második kutya neve: {masodik_kutya.nev}.")
# A tulajdonságokat bármikor meg is változtathatjuk:
elso_kutya.kor = 4
Vedd észre a varázslatot: a két objektum (elso_kutya és masodik_kutya) teljesen független egymástól. Ugyanabból a sablonból készültek, de saját, egyedi adataik vannak!
12.4. Metódusok: Mit tud csinálni az objektum?
Az objektumok nemcsak adatokat (tulajdonságokat) tudnak tárolni, hanem cselekedni is tudnak! Azokat a függvényeket, amelyeket egy osztály belsejében hozunk létre, metódusoknak nevezzük.
A metódusok zárójelébe is mindig be kell írni elsőként a self szót, hiszen a cselekvés során az objektumnak tudnia kell a saját adatairól.
class Kutya:
def __init__(self, nev, kor):
self.nev = nev
self.kor = kor
# Ez egy metódus (az objektum saját cselekvése)
def ugat(self):
print(f"{self.nev} mondja: Vau-vau!")
def szuletesnap(self):
self.kor = self.kor + 1
print(f"Boldog szülinapot! {self.nev} mostantól {self.kor} éves.")
# Használjuk az új metódusokat!
kutyam = Kutya("Buksi", 2)
kutyam.ugat() # Kimenet: Buksi mondja: Vau-vau!
kutyam.szuletesnap() # Kimenet: Boldog szülinapot! Buksi mostantól 3 éves.
12.5. Egységbezárás (Encapsulation)
Az OOP egyik legnagyobb előnye az úgynevezett egységbezárás. Látod, hogy a kutya neve, kora, és a képességei (hogy ugatni tud) nincsenek szétszórva a kód különböző pontjain. Egyetlen logikai dobozba (az objektumba) vannak csomagolva. Ha egy program 10 000 soros, ez a rendszerezés életmentő a programozó számára!
💻 Feladatok
- Saját tervrajz: Készíts egy
Konyvnevű osztályt! A konstruktorában (__init__) kapjon meg és mentsen el három tulajdonságot:cim,szerzo, ésoldalszam. - Az olvasás képessége: Készíts a
Konyvosztályon belül egyinformacio()nevű metódust! Ha ezt meghívják, írja ki a képernyőre a könyv adatait egy szép mondatban (pl.: "J.K. Rowling - Harry Potter (320 oldal)"). Ne felejtsd el használni aself-et! - A könyvtár: A főprogramban hozz létre két különböző könyv objektumot az általad írt osztályból (adj nekik tetszőleges címeket és adatokat)! Hívd meg mind a kettőre külön-külön az
informacio()metódust, és figyeld meg az eredményt!