Informatika2-2013/Gyakorlat13

A MathWikiből
(Változatok közti eltérés)
 
(egy szerkesztő 4 közbeeső változata nincs mutatva)
12. sor: 12. sor:
 
print isinstance(a, A) #True
 
print isinstance(a, A) #True
 
print isinstance(a, B) #False
 
print isinstance(a, B) #False
 +
</python>
 +
 +
== Egy új parancs ==
 +
 +
<python>
 +
if isinstance(a, B):
 +
    print "nem"
 +
else:
 +
    raise TypeError()
 
</python>
 
</python>
  
 
== Feladat ==
 
== Feladat ==
  
[ kezdeti file normal]
+
[http://math.bme.hu/~kkovacs/info2/emberek_kezdet_normal.py kezdeti file normal]
[ kezdeti file hard]
+
 
 +
[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:
45. sor: 55. sor:
 
* '''__sub__(self, jobboldal)''': megvalósítja a fent leírt kivonást
 
* '''__sub__(self, jobboldal)''': megvalósítja a fent leírt kivonást
 
* '''__repr__(self)''': a kényelem kedvéért
 
* '''__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., 02: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

kezdeti file normal

kezdeti file hard

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
Személyes eszközök