Python: objektum orientált programozás

Programozás Python

A Python egy objektumorientált programozási nyelv, amelynek alapját az objektumok képezik. (lásd C# fejezetnél) Az objektumorientált programozás (OOP) egy paradigma, amely az adatokat és a hozzájuk kapcsolódó műveleteket egységes egységekként kezeli, az úgynevezett osztályok és objektumok segítségével.

Az osztályok definíciói az adatok és a hozzájuk kapcsolódó műveletek leírását tartalmazzák. Az osztályokból objektumokat lehet létrehozni, ezek az osztályok példányai. Az objektumok állapotát, vagyis az adatokat, az objektumokra vonatkozó műveleteket, vagyis a metódusokat, valamint az objektumokkal való kapcsolattartási mechanizmust az osztályok definiálják.
Az objektumorientált programozás előnye, hogy lehetővé teszi az adatok és a hozzájuk kapcsolódó műveletek egységes kezelését, ami a fejlesztést és a karbantartást is egyszerűbbé teszi.
Az osztály olyan, mint egy tervrajz, egy példány = konkrét objektum, ami a tervrajz alapján elkészült.

Készítsük el első osztályunkat. Az osztály neve: Szemely.
Az objektumainak (emberek) 2 tulajdonságuk lesz: név, kor.
Új példányt úgy lehet létrhozni, hogy adunk neki egy nevet, megadjuk azt, melyik osztályból ‘származik’, és adunk neki konkrét adatokat. Ekkor fut le az __init__() függvény, ami létrehozza az új objektumot.
A self Pythonban az aktuális objektumra (példányra) mutató hivatkozás.

Másik lehetőség, hogy írunk az osztálynak egy függvényt, aminek a visszatérési értéke az adott objektum neve és kora.

Metódusok

Az osztályokban definiált függvényeket metódusoknak nevezzük. Többféle típusuk létezik, attól függően, hogy mit érnek el és hogyan használjuk őket.

Példánymetódus (instance method): Ez a leggyakoribb metódustípus. Az adott példány (objektum) adataival dolgozik. Első paramétere mindig self, az objektum attribútumait használja. A példában a bemutatkozas() metódus a konkrét objektumhoz tartozik.

Osztálymetódus (classmethod): az osztályra vonatkozik, nem egy konkrét példányra. @classmethod dekorátor első paramétere cls az osztály) gyakran alternatív konstruktornak használjuk. A Python közösségben a bevett konvenció: példánymetódusoknál: self osztálymetódusoknál: cls, de technikailag bármilyen nevet adhatunk nekik. A @classmethod miatt a Python automatikusan az osztályt adja át első paraméterként. Nem kell példányt létrehozni előtte

Statikus metódus (staticmethod): nem használ sem példányt, sem osztályt. @staticmethod dekorátor, nincs self vagy cls, általános segédfüggvény

Nézzük meg a következő példában, hogyan lehet egyszerre mindet használni!

Objektum tulajdonságának módosítása, törlése.

Tegyük fel, hogy szeretném átnevezni, vagy a korát átírni az első embernek. Bővítsd ki az előző programot, és máris át lett nevezve Teszt Elek

Objektum tulajdonságának törlése, vagy objektum törlése: del utasítással lehetséges. (pl: del ember.neve vagy del ember1 Ha töröltük bármelyiket, akkor kiíratásnál hibaüzenetet fogunk kapni, miszerint nem létezik a tulajdonság, illetve az adott objektum nincs definiálva.

Öröklődés

Az öröklődés (inheritance) azt jelenti, hogy egy osztály átveszi egy másik osztály tulajdonságait és metódusait.
Olyan, mintha egy „szülő” osztály képességeit a „gyerek” osztály megörökölné.

Miért jó az öröklődés?

  • Nem kell ugyanazt a kódot többször megírni
  • Átláthatóbb program
  • Újrafelhasználható kód

Nézzünk egy példát:
– minden diák is ember
– minden tanár is ember
Tehát: az Ember közös tulajdonságokat tartalmaz, a Diák és Tanár ezt örökli. Készítünk egy Diak osztályt. A Diak osztály megörökölte a koszon() metódust! A Diak osztálynak van egy saját metódusa is, tanul néven.

Metódus felülírás (override)

A gyerek osztály át is írhatja a szülő metódusát. Írjuk át a koszon metódust!

Adatelrejtés (encapsulation)

Az adatelrejtés azt jelenti, hogy az objektum adatait nem engedjük közvetlenül módosítani, hanem „védjük” őket. Olyan, mintha egy „dobozba” zárnánk az adatokat. Megakadályozza a hibás használatot, biztonságosabb lesz a programunk, jobban ellenőrizhetők az adatok.

Tulajdonságok (property)

A property lehetővé teszi, hogy egy változót úgy használj, mintha sima adat lenne, de közben mégis ellenőrzöd.

Feladatok, példák

Hozzunk létre egy téglalap osztályt, amely a téglalap a és b oldalának nagyságát tárolja. Adjunk az osztálynak 2 függvényt: kerület és terület kiszámítása. Adjunk egy eljárást is, ami kiírja mindegyik téglalap adatait! Ezután kérjük be 3db téglalap oldalait a felhasználótól, és mentsük el egy listába a téglalap objektumokat! Az info() eljárás meghívja a terület és kerület függvényeket minden egyes példányra.

Informatika ágazati alapvizsga feladat: híres utazók.
Az elkészítendő program bekéri három utazó adatait (név, születési év, elhalálozás éve,
földrész). A megadott adatokat egy-egy objektumban tárolja. Az adatok megadását követően
a program írja állományba a leghosszabb ideig élt utazó nevét és földrészét!
Írjon programot utazok.py néven!
a) Az adatok tárolására használt objektumok alapját képező osztályt az utazo_alap.py fájl
tartalmazza részben elkészítve. (nincs benne a földrész, ezt kell pótolni)
b) Kérje be a felhasználótól az utazók teljes nevét, születésük és haláluk évét, valamint a
földrészt, ahol kutatásaikat végezték, és tárolja el ezeket az adatokat! A tároláshoz
egészítse ki a kapott osztályt!
c) Határozza meg, melyik utazó hány évig élt, és írja ki ezt az adatot a képernyőre pl. „Jelky
András 45 évet élt”!
d) A leghosszabb életű utazó nevét és földrészét írja a „felfedez.txt” elnevezésű fájl első
sorába!