Informatika2-2013/Gyakorlat13
(Új oldal, tartalma: „== Feladat == Két osztályt kell megírni, melyek közt elég erõs kapocs van. Az osztályok: * '''Ember''': egy ember, dolgozó, vagy ilyesmi reprezentálása, nev…”) |
|||
(egy szerkesztő 6 közbeeső változata nincs mutatva) | |||
1. sor: | 1. sor: | ||
+ | == Egy új függvény == | ||
+ | |||
+ | <python> | ||
+ | class A: | ||
+ | pass | ||
+ | |||
+ | class B: | ||
+ | pass | ||
+ | |||
+ | a = A() | ||
+ | |||
+ | print isinstance(a, A) #True | ||
+ | print isinstance(a, B) #False | ||
+ | </python> | ||
+ | |||
+ | == Egy új parancs == | ||
+ | |||
+ | <python> | ||
+ | if isinstance(a, B): | ||
+ | print "nem" | ||
+ | else: | ||
+ | raise TypeError() | ||
+ | </python> | ||
+ | |||
== Feladat == | == Feladat == | ||
+ | |||
+ | [http://math.bme.hu/~kkovacs/info2/emberek_kezdet_normal.py kezdeti file normal] | ||
+ | |||
+ | [http://math.bme.hu/~kkovacs/info2/emberek_kezdet_hard.py kezdeti file hard] | ||
Két osztályt kell megírni, melyek közt elég erõs kapocs van. Az osztályok: | Két osztályt kell megírni, melyek közt elég erõs kapocs van. Az osztályok: | ||
12. sor: | 40. sor: | ||
Az '''Ember''' függvényei: | Az '''Ember''' függvényei: | ||
− | * '''__init__(...)''': | + | * '''__init__(...)''': létrehozza (és beállítja) a nev, neptun, nem (stringek), kor (egész), tel (stringek listája) adattagokat. |
+ | * '''szuletesnap(self):''': lépteti eggyel a kor-t | ||
+ | * '''ujTelefonszam(self, szam)''': felvesz egy új telefonszámot a telefonszám listába | ||
+ | * '''torolTelefonszam(self, szam)''': töröl egy telefonszámot, használjuk a listák .remove(x) metódusát, ami törli az x elemet (nem az x.-et) | ||
+ | * '''__add__(self, jobboldal)''': megvalósítja a korábban leírt összeadást | ||
+ | * '''__eq__(self, jobboldal)''': a kényelem miatt írjuk meg (ez az == operátor), igazat ad, ha a két Ember neptunkódja megegyezik, amúgy hamisat | ||
+ | * '''__repr__(self)''': ismét kényelem kedvéért | ||
+ | |||
+ | A '''Csoport''' függvényei: | ||
+ | |||
+ | * '''__init__(...)''': létrehozza (és beállítja) a lista ('''Ember'''-ek listája), megnevezés (string) és letszam (egész) adattagokat | ||
+ | * '''atnevez(self, megnevezes)''': átnevezi a '''Csoportot''' | ||
+ | * '''__add__(self, jobboldal)''': megvalósítja a fent leírt összeadást | ||
+ | * '''__sub__(self, jobboldal)''': megvalósítja a fent leírt kivonást | ||
+ | * '''__repr__(self)''': a kényelem kedvéért | ||
+ | |||
+ | A '''__repr__''' írhatja ki a '''Csoport'''/'''Ember''' nevét, vagy a listáját '''Csoport''' esetén, ezt rátok bízom. | ||
+ | |||
+ | === Segítség === | ||
+ | |||
+ | A feladat nehéz, a nehézség nagyrészt azon van, hogy az '''__add__''' függvény használja mindkét osztályt, így nem igazán lehet anélkül tesztelni, hogy megírnánk mindkettõt. | ||
+ | |||
+ | Ötletek az __add__ megírásának menetére: | ||
+ | |||
+ | * Írjátok meg elõször az '''Ember''' és a '''Csoport''' osztályok minden más függvényét (persze a __sub__-ot is kihagyva). | ||
+ | * Ezek után írjátok meg az '''Ember''' '''__add__'''-ját úgy, hogy feltételezzük, hogy két '''Ember'''-t adunk össze, az eredmény ugye egy 2 elemû '''Csoport''' | ||
+ | * Teszteljétek, hogy jól mûködik-e (tesztesetekbõl cs1) | ||
+ | * Majd írjátok meg a '''Csoport''' osztály '''__add__'''-ját, úgy hogy feltételezzük, hogy egy '''Ember'''-t adunk hozzá. A nehézség ebben az, hogy ha már eleme a listának, akkor ne adjuk hozzá újra, használhatjátok a """if e not in list:""" konstrukciót. | ||
+ | * Teszteljétek, cs2 | ||
+ | * Ennek a fordítottja, hogy ha egy '''Ember'''-hez adunk egy '''Csoport'''-ot (ez ugye az '''Ember''' '''__add__''' függvényéhez tartozik). Mostantól ezt az '''__add__'''-ot két esetre kell bontani egy '''if''' és az '''isinstance''' függvény használatával. | ||
+ | * Teszteljétek, cs3 | ||
+ | * Végül a Csoport + Csoport-ot írjátok meg az elõzõ mintájára, itt nem könnyû vizsgálni, hogy vannak-e duplikált elemek, de megoldható | ||
+ | |||
+ | |||
+ | * A kivonást rátok bízom, kicsit bonyolultabb talán mint a Csoport + Csoport, de itt is két eset van: Csoport - Ember és Csoport - Csoport |
A lap jelenlegi, 2013. május 7., 03:47-kori változata
Tartalomjegyzék |
Egy új függvény
class A: pass class B: pass a = A() print isinstance(a, A) #True print isinstance(a, B) #False
Egy új parancs
if isinstance(a, B): print "nem" else: raise TypeError()
Feladat
Két osztályt kell megírni, melyek közt elég erõs kapocs van. Az osztályok:
- Ember: egy ember, dolgozó, vagy ilyesmi reprezentálása, neve van, neptun kódja, neme, kora, és telefonszámai
- Csoport: több Ember-bõl állhat, külön megnevezése van, tárolja a csoport létszámát is
Az osztályokat úgy kell megírni, hogy két Ember-t összeadva egy Csoport-ot kapjunk, egy Csoport és egy Ember összegeként is értelemszerûen azt a Csoport-ot kapjuk amihez hozzávettük az adott Ember-t. Végül két Csoport összegeként az úniójukat kell vennünk.
Valamint szeretnénk még kivonást is írni, ami két halmaz különbsége szerûen mûködik.
Az Ember függvényei:
- __init__(...): létrehozza (és beállítja) a nev, neptun, nem (stringek), kor (egész), tel (stringek listája) adattagokat.
- szuletesnap(self):: lépteti eggyel a kor-t
- ujTelefonszam(self, szam): felvesz egy új telefonszámot a telefonszám listába
- torolTelefonszam(self, szam): töröl egy telefonszámot, használjuk a listák .remove(x) metódusát, ami törli az x elemet (nem az x.-et)
- __add__(self, jobboldal): megvalósítja a korábban leírt összeadást
- __eq__(self, jobboldal): a kényelem miatt írjuk meg (ez az == operátor), igazat ad, ha a két Ember neptunkódja megegyezik, amúgy hamisat
- __repr__(self): ismét kényelem kedvéért
A Csoport függvényei:
- __init__(...): létrehozza (és beállítja) a lista (Ember-ek listája), megnevezés (string) és letszam (egész) adattagokat
- atnevez(self, megnevezes): átnevezi a Csoportot
- __add__(self, jobboldal): megvalósítja a fent leírt összeadást
- __sub__(self, jobboldal): megvalósítja a fent leírt kivonást
- __repr__(self): a kényelem kedvéért
A __repr__ írhatja ki a Csoport/Ember nevét, vagy a listáját Csoport esetén, ezt rátok bízom.
Segítség
A feladat nehéz, a nehézség nagyrészt azon van, hogy az __add__ függvény használja mindkét osztályt, így nem igazán lehet anélkül tesztelni, hogy megírnánk mindkettõt.
Ötletek az __add__ megírásának menetére:
- Írjátok meg elõször az Ember és a Csoport osztályok minden más függvényét (persze a __sub__-ot is kihagyva).
- Ezek után írjátok meg az Ember __add__-ját úgy, hogy feltételezzük, hogy két Ember-t adunk össze, az eredmény ugye egy 2 elemû Csoport
- Teszteljétek, hogy jól mûködik-e (tesztesetekbõl cs1)
- Majd írjátok meg a Csoport osztály __add__-ját, úgy hogy feltételezzük, hogy egy Ember-t adunk hozzá. A nehézség ebben az, hogy ha már eleme a listának, akkor ne adjuk hozzá újra, használhatjátok a """if e not in list:""" konstrukciót.
- Teszteljétek, cs2
- Ennek a fordítottja, hogy ha egy Ember-hez adunk egy Csoport-ot (ez ugye az Ember __add__ függvényéhez tartozik). Mostantól ezt az __add__-ot két esetre kell bontani egy if és az isinstance függvény használatával.
- Teszteljétek, cs3
- Végül a Csoport + Csoport-ot írjátok meg az elõzõ mintájára, itt nem könnyû vizsgálni, hogy vannak-e duplikált elemek, de megoldható
- A kivonást rátok bízom, kicsit bonyolultabb talán mint a Csoport + Csoport, de itt is két eset van: Csoport - Ember és Csoport - Csoport