Az objektumorientált programozás alapjai
Ebben a fejezetben megismerkedünk az objektumorientált programozás – az OOP – elméletével és gyakorlatával.
Beszélünk a programozási paradigmákról, az OOP-t támogató programozási nyelvekről, az OOP előnyeiről és az alapelveiről.
Az elméleti ismereteinket a gyakorlatban is kipróbáljuk, egyre komplexebb példák segítségével ásunk mind mélyebbre.
Beadandó feladatok:
- I. Osztályok és objektumok
- 1.1 Feladat: Készíts egy programot, amelyben van egy Negyzet nevű osztály. Attribútuma legyen az oldal hossza. Rendelkezzen továbbá a kerület és terület számításra is egy-egy metódussal!
- 1.2 Feladat: Módosítsd az előző programot úgy, hogy a metódus ne a kerület- illetve a területértékkel térjen vissza, hanem maga gondoskodjon ezen értékek kiírásáról egy egész mondatos formában.
- 1.3 Feladat: Az 1.1 feladatban meghatározottak szerint készíts egy programot, amely a felhasználótól egymás után bekér négyzetek oldalhosszát egészen addíg, amíg a felhasználó 0 értéket nem ad meg! Ezen adat alapján a program hozzon létre negyzet objektumokat, melyeket egy listában tárol! A program írja ki a megadott négyzetek oldalhosszát, kerületét és területét!
- 2. Feladat: Készíts egy programot, amely objektumorientált módon tartja nyilván kutyák adatait (név, életkor, nem)! A nevét a felhasználó adja meg, az életkorát és a nemét véletlenszerűen határozza meg a program! Befejezésként a program a képernyőre írja ki a megadott kutyák adatait!
- II. Osztályok jellemzői:
- 1.1 Feladat: Hozz létre egy Diak nevű osztályt. Attribútumai: név, osztály, születési év. Az egyik metódusa állíptsa meg az aktuális év és a születési év alapján a diák életkorát, a másik metódusa pedig adjon vissza egy f-sztringet, amelyben mondatszerűen szerepelnek a diák adatai: Szia, Kiss Péter vagyok, a 10.A osztályba járok, 16 éves vagyok.
- 1.2 Feladat: Fejleszd tovább az előző programot úgy, hogy az osztálynak legyen osztályattribútuma, osztály- és statikus metódusa!
- 1.3 Feladat: Fejleszd tovább az előző programot úgy, hogy az hozzon létre öt Diak-objektumot. A nevet egy-egy vezeték és keresztneveket tartalmazó listából állítsa össze véletlenszerűen, az osztályt és a születési évet pedig szintén véletlenszerűen generálja! A Diak-objektumokat egy listában tárolja! A program a listát bejárva írja ki a diákadatokat a képernyőre!
- III. OOP alapelvei
1.1 Feladat: Készíts egy programot, amelyben van egy Negyzet nevű osztály. Attribútuma legyen az oldal hossza. Rendelkezzen továbbá a kerület és terület számításra is egy-egy metódussal!
import random
class Negyzet:
def __init__(self, oldalhossz):
self.oldalhossz = oldalhossz
def terulet(self):
return pow(self.oldalhossz, 2)
def kerulet(self):
return self.oldalhossz * 4
negyzetek = []
for _ in range(5):
negyzet = Negyzet(random.randint(2, 20))
negyzetek.append(negyzet)
for negyzet in negyzetek:
print(f'Ha pl. a négyzet oldala: {negyzet.oldalhossz} egység, '
f'akkor a területe: {negyzet.terulet()} egységnégyzet '
f'kerülete pedig: {negyzet.kerulet()} egység.')
1.2 Feladat: Módosítsd az előző programot úgy, hogy a metódus ne a kerület- illetve a területértékkel térjen vissza, hanem maga gondoskodjon ezen értékek kiírásáról egy egész mondatos formában.
import random
class Negyzet:
def __init__(self, oldalhossz):
self.oldalhossz = oldalhossz
self.terulet = pow(self.oldalhossz, 2)
self.kerulet = self.oldalhossz * 4
print(f'Ha pl. a négyzet oldala: {self.oldalhossz} egység,'
f' akkor a területe: {self.terulet} egységnégyzet '
f'kerülete pedig: {self.kerulet} egység.')
negyzetek = []
for _ in range(5):
negyzet = Negyzet(random.randint(2, 20))
negyzetek.append(negyzet)
"""
Vagy nem tudom mire gondolt a feladat aklkotója:
(1_3_feladatban egy harmadik verzió is van, ott a kiíró függvény
az osztályon kívűl lett elhelyezve)
import random
class Negyzet:
def __init__(self, oldalhossz):
self.oldalhossz = oldalhossz
self.terulet = pow(self.oldalhossz, 2)
self.kerulet = self.oldalhossz * 4
self.kiir()
def kiir(self):
print(f'Ha pl. a négyzet oldala: {self.oldalhossz} egység,
akkor a területe: {self.terulet} egységnégyzet '
f'kerülete pedig: {self.kerulet} egység.')
negyzetek = []
for _ in range(5):
negyzet = Negyzet(random.randint(2, 20))
negyzetek.append(negyzet)"""
1.3 Feladat: Az 1.1 feladatban meghatározottak szerint készíts egy programot, amely a felhasználótól egymás után bekér négyzetek oldalhosszát egészen addíg, amíg a felhasználó 0 értéket nem ad meg! Ezen adat alapján a program hozzon létre negyzet objektumokat, melyeket egy listában tárol! A program írja ki a megadott négyzetek oldalhosszát, kerületét és területét!
class Negyzet:
def __init__(self, oldalhossz):
self.oldalhossz = oldalhossz
def terulet(self):
return pow(self.oldalhossz, 2)
def kerulet(self):
return self.oldalhossz * 4
def kiir(negyzet):
print(f'A négyzet oldala: {negyzet.oldalhossz} egység,'
f' területe: {negyzet.terulet()} egységnégyzet '
f'kerülete pedig: {negyzet.kerulet()} egység.')
oldalhossz = 0
negyzetek = []
while oldalhossz != "0":
oldalhossz = input("Add meg négyzet oldalainak hosszát: ")
if oldalhossz == "0" or not oldalhossz.isdigit():
print("Nullát vagy valótlan adatot adtál meg,"
" ilyen négyzet nem létezik! Program Vége!")
else:
negyzet = Negyzet(int(oldalhossz))
negyzetek.append(negyzet)
kiir(negyzet)
print('A megadott négyzetek kiíratása: \n')
for negyzet in negyzetek:
print(f'A négyzet oldala: {negyzet.oldalhossz} egység,'
f' akkor a területe: {negyzet.terulet()} egységnégyzet '
f'kerülete pedig: {negyzet.kerulet()} egység.')
2. Feladat: Készíts egy programot, amely objektumorientált módon tartja nyilván kutyák adatait (név, életkor, nem)! A nevét a felhasználó adja meg, az életkorát és a nemét véletlenszerűen határozza meg a program! Befejezésként a program a képernyőre írja ki a megadott kutyák adatait!
import random
class Kutya:
def __init__(self, nev, eletkor, nem):
self.nev = nev
self.eletkor = eletkor
self.nem = nem
kutya_neve = " "
kutyak = []
while kutya_neve != "":
kutya_neve = input("Add meg a kutya nevét (ha végeztél,"
" csak üss ENTERT): ")
if kutya_neve == "":
print("Nem adtál meg kutyának nevet! Program Vége!")
else:
eletkor = random.randint(1, 20)
nem = random.choice([True, False])
if nem:
nem = "szuka"
else:
nem = "kan"
kutya = Kutya(kutya_neve, eletkor, nem)
kutyak.append(kutya)
for kutya in kutyak:
print(f'A kutya neve: {kutya.nev}, '
f'életkora: {kutya.eletkor}, neme: {kutya.nem}')
1.1 Feladat: Hozz létre egy Diak nevű osztályt. Attribútumai: név, osztály, születési év. Az egyik metódusa állíptsa meg az aktuális év és a születési év alapján a diák életkorát, a másik metódusa pedig adjon vissza egy f-sztringet, amelyben mondatszerűen szerepelnek a diák adatai: Szia, Kiss Péter vagyok, a 10.A osztályba járok, 16 éves vagyok.
import datetime
class Diak:
def __init__(self, nev, osztaly, szuletesi_ev):
self.nev = nev
self.osztaly = osztaly
self.szuletesi_ev = szuletesi_ev
def eletkor(self):
return datetime.datetime.now().year - self.szuletesi_ev
def kiir_adat(self):
return f"Szia, {self.nev} vagyok, a {self.osztaly} " \
f"osztályba járok, {self.eletkor()} éves vagyok."
diak01=Diak('Kiss Péter', '8.A', 2008)
diak02=Diak('Nagy László', '2.C', 2014)
print(diak01.kiir_adat())
print(diak02.kiir_adat())
1.2 Feladat: Fejleszd tovább az előző programot úgy, hogy az osztálynak legyen osztályattribútuma, osztály- és statikus metódusa!
import datetime
class Diak:
also_tagozatos = 0
felso_tagozatos = 0
def __init__(self, nev, osztaly, szuletesi_ev):
self.nev = nev
self.osztaly = osztaly
self.szuletesi_ev = szuletesi_ev
# az osztály második karaktere szám (10., 11., 12. stb.. mind felső)
if self.osztaly[1:2].isdigit():
type(self).felso_tagozatos += 1
else:
if int(self.osztaly[0:1]) > 4:
type(self).felso_tagozatos += 1
else:
type(self).also_tagozatos += 1
def eletkor(self):
return datetime.datetime.now().year - self.szuletesi_ev
def kiir_adat(self):
return f"Szia, {self.nev} vagyok, a {self.osztaly} " \
f"osztályba járok, {self.eletkor()} éves vagyok."
@classmethod
def diakok_letszama(cls):
return cls.also_tagozatos + cls.felso_tagozatos
@staticmethod
def suli_info():
return 'Futrinka Utcai Általános Iskola\nFaliújság\n\n'
diak01=Diak('Kiss Péter', '8.A', 2008)
diak02=Diak('Nagy László', '2.C', 2014)
print(Diak.suli_info())
print(diak01.kiir_adat())
print(diak02.kiir_adat())
print(f'Felsőtagozatos diákok létszáma: {Diak.felso_tagozatos}')
print(f'Alsótagozatos diákok létszáma: {Diak.also_tagozatos}')
print(f'Az iskola diákjainak létszáma: {Diak.diakok_letszama()}')
1.3 Feladat: Fejleszd tovább az előző programot úgy, hogy az hozzon létre öt Diak-objektumot. A nevet egy-egy vezeték és keresztneveket tartalmazó listából állítsa össze véletlenszerűen, az osztályt és a születési évet pedig szintén véletlenszerűen generálja! A Diak-objektumokat egy listában tárolja! A program a listát bejárva írja ki a diákadatokat a képernyőre!
import datetime
import random
class Diak:
also_tagozatos = 0
felso_tagozatos = 0
def __init__(self, nev, osztaly, szuletesi_ev):
self.nev = nev
self.osztaly = osztaly
self.szuletesi_ev = szuletesi_ev
if self.osztaly[1:2].isdigit():
type(self).felso_tagozatos += 1
else:
if int(self.osztaly[0:1]) > 4:
type(self).felso_tagozatos += 1
else:
type(self).also_tagozatos += 1
def eletkor(self):
return datetime.datetime.now().year - self.szuletesi_ev
def kiir_adat(self):
return f"Szia, {self.nev} vagyok, a {self.osztaly} " \
f"osztályba járok, {self.eletkor()} éves vagyok."
@classmethod
def diakok_letszama(cls):
return cls.also_tagozatos + cls.felso_tagozatos
@staticmethod
def suli_info():
return 'Futrinka Utcai Általános Iskola\nFaliújság\n'
diakok = []
vezeteknevek = ('Kis', 'Nagy', 'Szabó', 'Tóth', 'Pap', 'Dombai',
'Friedrich', 'Kovács', 'Majer', 'Rónai',
'Szalai', 'Magyar')
keresztnevek = ('Zoltán', 'Lajos', 'Tünde', 'János', 'Kálmán',
'Attila', 'Enikő','Anikó', 'István', 'Jenő',
'Péter', 'Mária')
betuk = ('A', 'B', 'C', 'D', 'E', 'T', 'Z')
# lehetséges osztályvégződések
for i in range(5):
diak_neve = vezeteknevek[random.randint(0, 11)]+ ' ' \
+ keresztnevek[random.randint(0,11)]
osztalya = str(random.randint(1,12)) + '.' \
+ random.choice(betuk)
szul_ev = random.randint(2008,2016)
diakok.append(Diak(diak_neve,osztalya,szul_ev))
print(Diak.suli_info())
for diak in diakok:
print(f'Diák neve: {diak.nev}, életkora: {diak.eletkor()}, '
f'osztálya: {diak.osztaly}, '
f'születési éve: {diak.szuletesi_ev}.')
print('\n')
print(f'Felsőtagozatos diákok létszáma: {Diak.felso_tagozatos}')
print(f'Alsótagozatos diákok létszáma: {Diak.also_tagozatos}')
print(f'Az iskola diákjainak létszáma: {Diak.diakok_letszama()}')
"""megjegyzés: ez így kicsit valótszerűtlen, elég lett volna csak
a születési évet random generálni, abból következne
hányadik osztályba jár, max. az osztály betűjelét
lehetett volna randomozni"""
1.1 Feladat – Suli: Készíts egy programot, amely képes tárolni:
– a diákok nevét és osztályát,
– a tanárok nevét és szakját / szakjait,
és ezeket meg is tudja jeleníteni a képernyőn egy összefüggő mondat formájában.
Például:
Szia, a nevem Kiss Péter, és a(z) 10.A osztályba járok.
Szia, a nevem Horváth Zita, biológia-kémia szakos tanár vagyok.
Szia, a nevem Schmidt Emil, matematika szakos tanár vagyok.
Használj objektumorientált megoldást!
– Először gondold végig, milyen osztályokra lesz szükség?
– Van-e lehetőség öröklődés alkalmazása révén optimálisabb kódot írni?
Szia, a nevem Kiss Péter, és a(z) 10.A osztályba járok.
Szia, a nevem Horváth Zita, biológia-kémia szakos tanár vagyok.
Szia, a nevem Schmidt Emil, matematika szakos tanár vagyok.
– Először gondold végig, milyen osztályokra lesz szükség?
– Van-e lehetőség öröklődés alkalmazása révén optimálisabb kódot írni?
class Szemely:
def __init__(self, nev):
self.nev = nev
def bemutatkozik(self):
print(f'Szia a nevem {self.nev}', end='')
class Diak(Szemely):
def __init__(self, nev, osztaly):
super().__init__(nev)
self.osztaly = osztaly
def bemutatkozik(self):
super().bemutatkozik()
print(f' és a(z) {self.osztaly} osztályba járok.')
class Tanar(Szemely):
def __init__(self, nev, szakok):
super().__init__(nev)
self.szakok = szakok
def bemutatkozik(self):
super().bemutatkozik()
print('', '-'.join(self.szakok), 'szakos tanár vagyok.')
szemelyek = {'diak01': (Diak('Kiss Péter', '10.A')),
'tanar01': Tanar('Horváth Zita', ['biológia', 'kémia']),
'tanar02': Tanar('Schmidt Emil', ['matematika'])}
for t in szemelyek.items():
t[1].bemutatkozik()
