Professional Documents
Culture Documents
xxi
A könyv szerkezete és használata
xxii
3. Az osztály – hogyan modellezzük a
világot
„... »Think like an object.« Of
course, this statement gets its
real meaning by contrast with
the typical approach to
software development: »Think
like a computer.«”
David West
29
3. Az osztály
termék 1 program
ár = 1000 termék 2 név = main.py
név = kis kocka régi ár = 15000
kód = T001 ár = 20000 dokumentáció
név = nagy kocka név = manual.pdf
kód = T002
leírás
termék 3 név = README
név = nano kocka
kód = T004 dokumentáció
ár = 2000 név = manual.html
3.2. Mi az osztály?
Az osztály a hasonló objektumok közös szerkezetét írja le. A Python nyelvben
ezek az osztályok (angolul class) az objektumok típusai (angolul type). Például,
ha egy rendelés nyilvántartó programban a termékeket objektumként szeretnénk
ábrázolni, akkor definiálunk egy Termék osztályt. Ez az osztálydefiníció azt írja
le, hogy hogyan jönnek létre az új objektumok példányváltozói, és itt definiáljuk
a metódusokat is, amelyek ezen példányváltozókat fogják olvasni vagy írni.
Az osztályok meghatározása a fejlesztés során kritikus: ha egyértelmű egy
osztály felelősségi köre, vagyis, hogy a valóság mely aspektusait akarjuk model-
lezni, akkor a program sokkal érthetőbb lesz. Az osztályok felelősségi körének
kijelölése csak a dokumentációban tud megjelenni, de ennek a döntésnek a kö-
vetkezménye, hogy az osztályokban milyen példányváltozókat és metódusokat
definiálunk. A termék-osztályunk teljesen másképp nézne ki, ha, mondjuk, ve-
gyi anyagokkal dolgoznánk, és nemcsak a nevét, hanem az anyag veszélyességét
és tárolási megszorításait is a termék példányváltozójaként kellene tárolni.
30
3.4. Példányváltozók és metódusok használata
termék_1: Termék
régi_ár = 1000 «instanceOf»
ár = 1000 Termék
név = kis kocka
kód = T001 termék_2: Termék + kód: str
régi_ár = 15000 «instanceOf» + név: str
ár = 20000 + ár: int
név = nagy kocka + régi_ár: int
termék_3: Termék kód = T002 + __init__(str, str, int): void
régi_ár = 2000 «instanceOf»
+ leértékel(int): void
ár = 2000
név = nano kocka
kód = T003
1 E G E S Z _ S Z A M _ 0 = int ()
2 E G E S Z _ S Z A M _ 5 = int ( ’ 5 ’ )
3.1. példa. Számobjektumok létrehozása
31
3. Az osztály
complex
real: float
imag: float
conjugate(): complex
1 I = c o m p l e x (0 , 1) # 0+1 j
2 v a l o s _ r e s z e = I . real
3 k e p z e t e s _ r e s z e = I . imag
4 k o n j u g a l t j a = I . c o n j u g a t e ()
3.2. példa. Műveletek komplex számokkal
1 class Termek :
2 def _ _ i n i t _ _ ( self , kod , nev , ar ) :
3 self . kod = kod
4 self . nev = nev
5 self . ar = ar
6 self . r e g i _ a r = ar
7
32
3.5. Osztályok definiálása
Termék
kód
név
ár
régi_ár
__init__(kód, név, ár): void
leértékel(mérték): void
8 def l e a r a z ( self , s z a z a l e k ) :
9 self . r e g i _ a r = self . ar
10 u j _ a r = self . ar * (1 - s z a z a l e k / 1 0 0 )
11 self . ar = r o u n d ( u j _ a r )
3.3. példa. Termék osztály definiálása
Az inicializáló metódus definiálja az újonnan létrejött objektum példányvál-
tozóit a kezdőértékük beállításával. Ennek a metódusnak a paraméterei lesznek
azok az értékek, amelyeket a példányosításnál az osztály neve utáni zárójelben
megadunk a 3.4. példában látható módon.
1 k01 = T e r m e k ( ’ K01 ’ , ’ k o c k a ’ , 1 0 0 0 )
3.4. példa. Termék objektum létrehozása
A 3.5. példa első sorában azt láthatjuk, hogyan definiálunk egy újabb k02
objektumot. A második sorban kiírjuk mind a korábban definiált k01, mind a
most definiált k02 objektumok árait és neveit. A harmadik sorban megváltoz-
tatjuk a k01 objektum árát és a negyedik sorban a k02 objektum nevét. Az
utolsó sorban kiírjuk ismét mind a két objektum nevét és értékét. Ez a pél-
da jól demonstrálja, hogy bár mindkét objektum példányváltozóit ugyanabban
az osztálydefinícióban írtuk le, értékeik az objektumokra egyedien jellemzők és
egymástól függetlenül változtathatók.
33
3. Az osztály
Van olyan szélsőséges eset is, amikor egy osztály csak példányváltozókat tar-
talmaz. Ilyenre a 3.5. ábrán látható Cim osztály egy jó példa, mivel csak
példányváltozókból áll: ország, irányítószám, város, cím. Az osztály definíciója
a 3.7. példában látható.
Cím
ország
irányítószám
város
cím
1 c l a s s Cim :
2 def _ _ i n i t _ _ ( self , orszag , irszam , varos , cim ) :
3 self . o r s z a g = o r s z a g
4 self . i r s z a m = i r s z a m
5 self . v a r o s = v a r o s
6 self . cim = cim
3.7. példa. Cím osztály definiálása
34
3.6. Osztályok közötti kapcsolatok
1 t e r m e k = T e r m e k ( ’ K01 ’ , ’ k o c k a ’ , 1 0 0 0 )
2 p r i n t ( id ( t e r m e k ) , dir ( t e r m e k ) )
3.8. példa. Egy objektum azonosítójának és attribútumainak a kiírása
Megrendelő Cím
számlázási cím
név ország
email szállítási cím irányítószám
telefon város
cím
1 class Megrendelo :
2 def _ _ i n i t _ _ ( self , nev , email , telefon ,
3 szallitasi_cim ,
4 s z a m l a z a s i _ c i m = None ) :
5 self . nev = nev
6 self . e m a i l = e m a i l
7 self . t e l e f o n = t e l e f o n
8 self . s z a l l i t a s i _ c i m = s z a l l i t a s i _ c i m
9 self . s z a m l a z a s i _ c i m = s z a m l a z a s i _ c i m
3.9. példa. Megrendelő osztály
35