python
Python - Objektumorientáltság, kivételkezelés
Borospince (40 pont)
Egy borospincében szekrények vannak, amelyek polcain borokat tárolnak. Készítsd el a BorospinceException
, Bor
és Szekreny
osztályokat a feladatleírás alapján! A feladatok megoldását egyetlen Python szkriptbe készítsd el!
1. A BorospinceException
osztály (2 pont)
Hozz létre egy BorospinceException
nevű kivételosztályt, amely az Exception
beépített kivételosztályból öröklődik! Készíts egy egyparaméteres konstruktort az osztályon belül, amely egy hibaüzenetet vár paraméterben! A konstruktorban hívd meg az ősosztály konstruktorát és add át neki paraméterben a hibaüzenetet!
2. A Bor
osztály (13 pont)
Hozz létre egy Bor
osztályt, amely a _fajta
, _evjarat
és _alkoholtartalom
adattagokkal rendelkezik!
-
Az osztály konstruktora a bor fajtáját, évjáratát és alkoholtartalmát várja paraméterben (ebben a sorrendben)!
- Az alkoholtartalom paraméter értékét ne legyen kötelező megadni, alapértéke legyen
12.5
! - Inicializáld a
_fajta
,_evjarat
és_alkoholtartalom
adattagokat a paraméterek alapján! (3 pont)
- Az alkoholtartalom paraméter értékét ne legyen kötelező megadni, alapértéke legyen
-
Írj get és set property-t a
_fajta
adattaghoz,fajta
néven! A getter adja vissza az adattag értékét, a setter pedig állítsa be azt a paraméterben kapott értékre! (2 pont) -
Írj get és set property-t az
_evjarat
adattaghoz,evjarat
néven! (1 pont) -
Írj get és set property-t az
_alkoholtartalom
adattaghoz is,alkoholtartalom
néven!- A setterben kezeld le, hogy csak 0 és 100 közötti valós szám lehessen az adattag értéke!
- Nem megfelelő típusú vagy értékű paraméter esetén dobj egy
BorospinceException
típusú kivételt, amit aNem megfelelo alkoholtartalom!
szöveggel inicializálj! (2 pont)
-
Írd át az osztály konstruktorát úgy, hogy az alkoholtartalom értéke itt is ellenőrizve legyen! (1 pont)
-
Definiáld felül az osztályban az objektum szöveggé alakításáért felelő metódust úgy, hogy az a következő szöveggel térjen vissza:
{_fajta} (evjarat: {_evjarat}), melynek alkoholtartalma: {_alkoholtartalom}%
(a kapcsos zárójelek helyére értelemszerűen a megfelelő értékek legyenek behelyettesítve)! (2 pont) -
Definiáld felül az osztályban az
==
operátor működését!- Ha az adott objektumot egy másik
Bor
objektummal szeretnénk összehasonlítani, akkor az operátor adja vissza, hogy a két bor fajtája, évjárata és alkoholtartalma rendre megegyezik-e! A fajták egyezésének vizsgálatakor a kis- és nagybetűket ne különböztesd meg (tehát pl.aszu
ésAszu
ugyanaz a fajtanév)! - Amennyiben a függvény nem
Bor
típusú paramétert kap, akkor logikai hamis értékkel térjen vissza! (2 pont)
- Ha az adott objektumot egy másik
3. A Szekreny
osztály (25 pont)
Hozz létre egy Szekreny
osztályt, amelynek egyetlen adattagja egy borok
nevű lista! Ebben a listában tároljuk a szekrény polcain lévő borokat.
-
Az osztály konstruktora nem vár paramétert, és a
borok
adattagot egy üres listával inicializálja! (2 pont) -
Írj egy
get_bor
metódust, amely paraméterül egyn
egész számot kap! A metódus térjen vissza aborok
listan
-edik indexű elemével!- Az egyszerűség kedvéért csak a nemnegatív indexeket kezeljük, így ha a paraméterben érkező
n
-érték negatív vagy nagyobb, mint a lista utolsó elemének indexe, akkor dobj egyBorospinceException
típusú kivételt, amit aNem letezo index!
szöveggel inicializálj! (3 pont)
- Az egyszerűség kedvéért csak a nemnegatív indexeket kezeljük, így ha a paraméterben érkező
-
Definiáld felül a
+=
operátort az osztályban úgy, hogy ha az egyBor
objektumot kap paraméterül, akkor szúrja be azt aborok
lista végére! Egyéb típusú paraméter esetén dobj egyTypeError
típusú kivételt, amit aNem bor!
szöveggel inicializálj! (3 pont) -
Definiáld felül a
+
operátort az osztályban, amely egy másikSzekreny
objektumot várjon paraméterben! Az operátor térjen vissza egy újSzekreny
objektummal, amelynek aborok
listája az aktuális és a paraméterben érkező objektumborok
listáinak összefűzése legyen! Nem megfelelő típusú paraméter esetén dobj egyTypeError
típusú kivételt, amit aNem szekreny!
szöveggel inicializálj! (3 pont) -
Írj egy
atlag_alkoholtartalom
metódust, amely térjen vissza a szekrényen lévő borok (borok
adattag) alkoholtartalmának átlagával! Amennyiben nincs egyetlen bor sem a szekrényen, akkor dobj egyBorospinceException
típusú kivételt, amit azUres a szekreny!
szöveggel inicializálj! (3 pont) -
Készíts egy paraméter nélküli
statisztika
metódust! A metódus számolja össze, hogy a különféle borfajtákból mennyi található a szekrényen, és az eredményt adja vissza egy dictionary-ben! (5 pont)- Ha a szekrényen nincs egyetlen bor sem, akkor a visszatérési érték egy üres dictionary.
- Ha a szekrényen van bor, akkor számold össze az egyes borfajták darabszámát! A borfajták nevében ne különböztesd meg a kis- és nagybetűket (tehát pl.
aszu
ésAszu
ugyanaz a fajtanév)!
A szekrény tartalma:
Bor('tokaji aszu', 2017, 13.5),
Bor('egri bikaver', 2013, 12.0),
Bor('TOKAJI ASZU', 2015, 13.8)
A statisztika metódus visszatérési értéke:
{'tokaji aszu': 2, 'egri bikaver': 1}
-
Írj egy
megisszak
metódust, amely egyBor
típusú objektumot vár paraméterben! A metódus törölje az adott bort aborok
listából, amennyiben az szerepel a listában! Feltehetjük, hogy minden bor objektum egyszer fordul elő a szekrényen.- Ha a bor nem szerepel a listában, akkor dobj egy
BorospinceException
típusú kivételt, amit aBor nem talalhato!
szöveggel inicializálj! - Ha a metódus nem
Bor
típusú paramétert kap, akkor dobj egyTypeError
típusú kivételt, amit aNem bor!
szöveggel inicializálj! (3 pont)
- Ha a bor nem szerepel a listában, akkor dobj egy
-
Definiáld felül az objektum szöveggé alakításáért felelő metódust az osztályban!
- Amennyiben a
borok
lista üres, akkor a metódus térjen vissza azEz egy ures szekreny.
szöveggel! - Ellenkező esetben a metódus térjen vissza egy olyan szöveggel, amely 1 vesszővel és 1 szóközzel elválasztva tartalmazza a szekrényen lévő borfajták nevét és az azokból meglévő mennyiséget,
{darab} {fajta}
formátumban! A szöveg végén ne legyen se vessző, se szóköz! (3 pont)
- Amennyiben a
statisztika
metódus visszatérési értékét!A szekrény tartalma:
Bor('tokaji aszu', 2017, 13.5),
Bor('egri bikaver', 2013, 12.0),
Bor('TOKAJI ASZU', 2015, 13.8),
Bor('chardonnay', 2019, 13.0)
Az __str__ metódus visszatérési értéke:
'2 tokaji aszu, 1 egri bikaver, 1 chardonnay'
Példa a kód működésére
bor1 = Bor('Tokaji aszu', 2017, 13.5)
bor2 = Bor('Gyanus kinezetu kannasbor', 2010)
bor3 = Bor('ToKaJi AsZu', 2015, 13.8)
bor4 = Bor('Chardonnay', 2019, 13.0)
bor2.fajta = 'Egri bikaver'
bor2.evjarat = 2013
bor2.alkoholtartalom = 12.0
print(f'{bor2.fajta}, {bor2.evjarat}, {bor2.alkoholtartalom}') # 'Egri bikaver, 2013, 12.0'
print(bor1) # 'Tokaji aszu (evjarat: 2017), melynek alkoholtartalma: 13.5%'
print(bor1 == Bor('TOKAJI ASZU', 2017, 13.5)) # True
print(bor1 == bor2) # False
print(bor1 == 'Hibas tipusu parameter!') # False
szekreny1 = Szekreny()
szekreny2 = Szekreny()
szekreny1 += bor1
szekreny1 += bor2
szekreny1 += bor3
szekreny2 += bor4
szekreny3 = szekreny1 + szekreny2
print(szekreny3.get_bor(0)) # 'Tokaji aszu (evjarat: 2017), melynek alkoholtartalma: 13.5%'
print(szekreny3.get_bor(3)) # 'Chardonnay (evjarat: 2019), melynek alkoholtartalma: 13.0%'
print(szekreny3.atlag_alkoholtartalom()) # 13.075
szekreny2.megisszak(bor4)
print(szekreny2.statisztika()) # {}
print(szekreny3.statisztika()) # {'tokaji aszu': 2, 'egri bikaver': 1, 'chardonnay': 1}
print(szekreny2) # 'Ez egy ures szekreny.'
print(szekreny3) # '2 tokaji aszu, 1 egri bikaver, 1 chardonnay'