Informatika2-2013/Gyakorlat10
Osztályok
- Az osztályok egységbe zárnak és a felesleges információt elrejtik.
- Az osztályok metódusokat és változókat tartalmaznak.
- Tekintsünk erre úgy, hogy a kód egy részét (mind tárolókat, mind a függvényeket nézve) összefogjuk.
- Egy objektum egy osztály konkrét megvalósítása.
Saját osztályt így definiálhatunk:
class MyClass: valt = 5 def fv(self): return self.valt * 2
Itt a valt változó az osztályhoz tartozik, így elérhetjük például """MyClass.valt"""-al. Viszont, ha a fv-t próbáljuk hasonlóképpen elérni hibába ütközünk. Ez azért van, mert az osztályt nem közvetlenül szokták használni, hanem példányosítják:
x = MyClass() # létrehozunk egy MyClass típusú objektumot x.fv() # így már menni fog a fv metódus
Így definiált objektumokhoz késõbb is hozzávehetünk még adattagokat:
x = MyClass() x.ujValt = "Valami" print x.ujValt #print MyClass.ujValt ez nem menne, mert az ujValt az x objektumhoz tartozik és nem az osztályához
Osztályoknak léteznek speciális metódusai, ezekrõl részletesebben következõ gyakorlaton lesz szó, most nézzük csak az __init__-et. Ez az a függvény, ami meghívódik amikor létrehozunk egy ilyen típusú objektumot, azaz pl az x = MyClass() parancsnál ez hívódik. Aki nem hiszi próbálja lefuttatni ezt:
class Test: def __init__(self): print "Mostmar elhiszed?" x = Test()
Mi ez a self amit mindig megadunk a metódusoknak? Ezzel a változóval hivatkozhatunk magára az objektumra amin meghívtuk az adott metódust, példából jobban érthetõ:
class Pelda: def fv(self, szam): self.v = szam x = Pelda() y = Pelda() x.fv(5) y.fv(15) print x.v print y.v # Ez a fv metódus olyan volt, mintha már az x létrehozása után azt írtam volna, hogy x.v = 5
Amint látjátok a self változót nem kell nekünk átadnunk amikor meghívjuk a metódusokat, ez automatikusan megtörténik. (Pelda.fv(x, 5) <=> x.fv(5))
Ha az __init__ függvény nem csak a self-et, hanem más változókat is kap, akkor ezeket is meg kell adnunk, pl:
class Test: def __init__(self, szam): self.x = szam x = Test(15) print x.x
5. Osztály feladat - Telefonkönyv
Egészítsétek ki a következõ osztályt, hogy egy ilyen objektum létrehozásakor megadhassunk neki két listát amikben nevek és telefonszámok szerepelnek, ezeket tárolja el adattagként. Valamint a hozzavesz metódusa vegyen hozzá egy nevet és a hozzá tartozó telefonszámot a listákhoz.
class Telefonkonyv: def __init__(self, nevek, telefonszamok): pass def hozzavesz(self, nev, telefonszam): pass
A pass kulcsszó csak azért van ott, mert pythonban minden blokkban kell lennie legalább egy parancsnak. A pass nem csinál semmit csak kitölti a teret.