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.
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.
# osztály létrehozása:
class Szemely:
def __init__(self, nev, kor):
self.neve = nev
self.kora = kor
# példány létrehozása:
ember1 = Szemely("Teszt ELek", 42)
ember2 = Szemely("Winch Eszter", 22)
# első 'példány' tulajdonságainak kiíratása:
print(ember1.neve)
print(ember1.kora)
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.
class Szemely:
def __init__(self, nev, kor):
self.neve = nev
self.kora = kor
def __str__(self):
return f"{self.neve}({self.kora})"
ember1 = Szemely("Teszt ELek", 42)
print(ember1)
Természetesen eljárásokkal is bővíthetjük az osztályt. Itt egy eljárást készítettem, ami üdvózli a megadott emberkét:
class Szemely:
def __init__(self, nev, kor):
self.neve = nev
self.kora = kor
def eljaras(self):
print("Üdv! Én vagyok " + self.neve)
ember1 = Szemely("Megfigy ELek", 30)
ember1.eljaras()
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
ember1.neve = "Senki"
ember1.kora = "100"
ember1.eljaras()
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.
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.
class Teglalap:
def __init__(self, a, b):
self.a = a
self.b = b
def terulet(self):
return self.a * self.b
def kerulet(self):
return 2 * (self.a + self.b)
def info(self):
print("A téglalap a oldala:", self.a)
print("A téglalap b oldala:", self.b)
print("A téglalap területe:", self.terulet())
print("A téglalap kerülete:", self.kerulet())
teglalapok = []
for i in range(3):
a = int(input("Adja meg a(z) {} téglalap a oldalát: ".format(i+1)))
b = int(input("Adja meg a(z) {} téglalap b oldalát: ".format(i+1)))
teglalapok.append(Teglalap(a, b))
s=0
for teglalap in teglalapok:
s=s+1
print("A(z) {} téglalap adatai".format(s))
teglalap.info()
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!
# ---- utazo_alap.py tartalma ----
class Utazo:
def __init__(self, név, született, halál, földrész):
self.név = név
self.született = született
self.meghalt= halál
self.földrész = földrész
def életkor(self):
return self.meghalt - self.született
# ---- main.py tartalma ----
# importáljuk az osztályt az utazo_alap.py-ből
from utazo_alap import Utazo
max_eletkor = -1
max_eletkor_index = -1
lista = []
for i in range(3):
név = input("Kérem egy híres utazó nevét!")
született = int(input("Add meg mikor született:"))
meghalt = int(input("Add meg mikor halt meg:"))
földrész = input("Add meg melyik földrészen tett felfedezést")
#létrehozza az objektumot, tehát egy konkrét utazót
ember = Utazo(név, született, meghalt, földrész)
#beletesszük a listába az objektumot
lista.append(ember)
#adott utazó életkora, az eletkor() függvénnyel kiszámítva
eletkor = ember.eletkor()
#maximum kiválasztás - ha az aktuális ember életkora nagyobb, mint max, ez lesz a max
if eletkor > max_eletkor:
max_eletkor = eletkor
max_eletkor_index = len(lista)-1
# Kiíratás - melyik utazó meddig élt
for utazo in lista:
eletkor = utazo.eletkor()
neve = utazo.név
print(f"{neve} {eletkor} évig élt")
# Leghosszabb ideig élt utazó adatait kiírjuk txt-be
leghosszabb_eletu = lista[max_eletkor_index]
with open("felfedez.txt","w") as fajl:
fajl.write(f"{leghosszabb_eletu.név} {leghosszabb_eletu.földrész}")