Ügyességi játékok programozása
Pythonnal és Pygame-melChapter 14: Könyvtárak és modulok
A könyvtár nem más, mint függvények és osztályok kódgyűjteménye. Általában ezeket a könyvtárakat valaki más írta, és így nem kell állandóan feltalálnunk a kereket. A Pythonban ezt a szót arra használjuk, hogy egy kód könyvtárat nevezzünk meg, amiben modulok vannak.
Az import pygame és az import random, amiket már használtunk a programjaink során, szintén modulokat használnak. Egy könyvtár többféle modult tartalmazhat, amit lehet importálni. Gyakran egy könyvtárban egy modul van, így ezek a szavak felcserélhetők a legtöbb esetben.
A modulok gyakran vannak hasonló funkció alapján csoportba fogva. Ebben a tananyagban mi is használtunk már függvényeket, a math modulból, a random modulból és a pygame könyvtárból. A modulokat így lehet szervezni, hogy egyes modulok más modulokat is tartalmazzanak. Például, a pygame könyvtár tartalmaz olyan alkönyvtárakat, hogy pygame.draw, pygame.image, és pygame.mouse.
A modulokat nem töltjük be, egészen addig, amíg a program nem kéri. Ez időt takarít meg a számítógép memóriájában. Ez a fejezet azt mutatja meg, hogyan alkoss meg egy modult, és hogyan importáld azt, amikor használni akarod.
14.1 Minek hozzunk létre könyvtárakat?
Három okunk lehet programozóként megalkotni a saját könyvtárunkat:
- A kódot kisebb, könnyebben használható részekre tudjuk szedni
- Több embernek is lehetővé teszi, hogy dolgozzanak a programon.
- A kódot könnyebb megosztani más programozóval.
Néhány általunk írt program is jócskán hosszabb lenne. Egy nagy programot elkülöníteni kisebb programokra, könnyebb lesz a kódot kezelni. Például, az előző fejezetben, a sprite példáknál, a sprite osztályt a programozó akár külön fájlban is tárolhatná. Egy komplexebb programban minden sprite-nak saját fájlja lenne.
Ha több programozó dolgozik ugyanazon a projekten, akkor szinte lehetetlen ha minden kód egy fájlban van. Azontúl a programot több fájlba tördelni még könnyebben áttekinthetővé is teszi azt. Egy programozó például csak az "Ork" sprite osztályon dolgozik. Egy másiknak meg csak a "Goblin" sprite osztály maradna, Mivel a sprite-ok különböző fájlokban vannak a programozók nem kerülnek egymással konfliktusba.
Modern programozók már ritkán építenek fel programot vázlatból. Általában olyan programokat építenek, amik más programok részei, és hasonlóan működnek. Ha egy programozó olyan kódot ír, ami képes a hitelfelvételi eljárás formanyomtatványát kezelni, akkor az a kód ideális lesz egy könyvtárban. Azután bármely programozó meghívhatja majd, ha ilyenre lesz szüksége.
14.2 Saját modulod/könyvtárad fájl létrehozása:
Ebben a példában részeire szedünk egy rövid programot, ami több fájlból áll. Elsőnek itt van a test.py függvényünk, és ahogy meghívjuk:
# ufó függvény def foo(): print ("ufó!") # ufó hívása foo()
Igen, ez a program nem túl hosszú és egy fájlban van benne. De ha mind a függvény és mind a főprogram hosszú lenne, akkor már más lenne a helyzet. Ha sok függvényünk van, mindegyik 100 sor hosszú, akkor már az is időt vesz igénybe, ahogyan kezeljük a fájlt. De ebben a példában a kódot röviden tartjuk áttekinthetőségért.
Használhatjuk az ufó függvényt a fájlon kívül is. Ekkor a fájlt ott kell hagynunk a főprogram mellett. (A példában erre nincs okunk, hogy külön kezeljük őket, csak a tanulás kedvéért tesszük.)
Ahhoz, hogy ezt megtegyük, készítsünk egy új fájlt és másoljuk bele az ufó függvényt. Mentsük el az új fájlt my_functions.py néven. Ugyanabba a könyvtárba tegyük lehetőleg, ahol a test.py fájl van.
# ufó függvény def foo(): print ("ufó!")
# Az ufó meghívása, ahogyan nem működik foo()
Sajnos ez nem ilyen egyszerű. A test.py fájl nem tudja, hogy ezt a my_functions.py-ból kell neki meghívnia. Nekünk kell importálnunk:
# A my_functions.py fájl importálása import my_functions # Az ufó hívása, és még mindig nem működik foo()
Még mindig nem működik. Mi hiányzik? Ugyanúgy, ahogyan a pygame-t importáljuk, bele kell tennünk a csomag nevét a függvénybe. Mint itt:
# Importálom a my_functions.py fájlt import my_functions # Az ufó hívása, ahogyan MÁR működik my_functions.foo()
Ez azért működik, mivel a my_functions előtag szükséges a függvény meghívásához.
14.3 Névtartomány
Egy programnak kétféle könyvtár fájlt kellene használnia. Mi van akkor, ha vannak olyan könyvtárak, amelyekben a függvények neve ugyanaz? Mi van akkor, ha két függvényt neveztünk el print_report-nak, ahol az egyik kiírja az osztályzatot, a másik meg a számlát? Például:
def print_report(): print ("Diákok osztályzatának jelentése:" )
def print_report(): print ("Pénzügyi jelentés:" )
Honnan tudja a program, hogy melyik függvényt hívtuk meg? Nos, ez könnyű. Meg kell adnod a névtartományt. A névtartománynak meg kell jelennie a függvény neve előtt, mint a lenti kódban:
import student_functions import financial_functions student_functions.print_report() financial_functions.print_report()
Nos, már láthatod, hogy miért van erre szükség. De mi van akkor, ha nincs névütközés? Állandóan gépelgetni a neveket elég fárasztó. Megteheted ennek a könnyítését, ha a helyi névtartományba importálod be a könyvtárat. A helyi névtartomány az osztályok, függvények és változók listája, melyeknél nem kell megadnod a névtartományt. Menjünk vissza az ufós példára, töröljük az eredeti importot és helyettesítsük egy új típusú importtal:
# ufó importálása from my_functions import * foo()
Ez működni fog anélkül is, hogy a my_functions-t hozzáadnénk a függvény hívásához. A csillag egy joker-lap, amivel minden függvény le tudunk hívni a my_functions-ből. Egy programozó képes egyenként is meghívni a kívánt függvényeket.
14.4 Harmadik fél könyvtárai
Amikor Pythonban dolgozunk, lehetőség van arra, hogy sokféle könyvtárat használjunk, amit
már korábban létrehoztak. Vess egy pillantást a könyvtárakra, melyek elérhetőek innen:
http://docs.python.org/3/py-modindex.html
Lehetőség van arra, hogy letöltsünk és installáljunk más könyvtárakat. Vannak könyvtárak, melyek a webbel, a komplex számokkal, adatbázisokkal és egyebekkel dolgoznak.
- Pygame: Ez az a könyvtár, amivel játékokat hozhatunk létre.
http://www.pygame.org/docs/ - wxPython: GUI programok hozhatunk létre ablakokkal, menükkel.
http://www.wxpython.org/ - pydot: komplex irányított, és nem irányított grafika.
http://code.google.com/p/pydot/ - NumPy: Mátrixokkal dolgozó kifinomult könyvtár.
http://numpy.scipy.org/
A Python könyvtárak csodás listája és azok installjainak linkjei itt érhető el:
http://www.lfd.uci.edu/~gohlke/pythonlibs/
Ha átlapozod a könyvtárak listáit, akkor lehetővé válik számodra, hogy legyen valami gyors képed arról, milyen programokat lehet létrehozni. A legtöbb program alkotásakor nagy részeket illesztünk össze, ahelyett, hogy mident vázlatból írnánk meg.
14.5 Áttekintés
14.5.1 Kvízkérdések
Click here for a multiple-choice quiz.
14.5.2 Feladatlap
Click here for the chapter worksheet.
14.5.3 Labor feladat
Click here for the chapter lab.
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin