Kap 3.7
Egna moduler och import
Dela upp programmet i flera Pythonfiler med tydliga ansvarsområden.
Mål
Efter lektionen ska du kunna...
- förklara vad en modul är
- skapa en modul med funktioner eller klasser
- importera hela moduler eller enskilda delar
- dela upp ett program i logiska filer
Problemet
En enda fil kan bli svår att överblicka
main.py
├── klasser
├── beräkningar
├── filhantering
├── meny
└── programstart
Olika delar av programmet blandas i samma fil.
Det blir svårare att hitta, testa och återanvända kod.
Modul
En modul är en Pythonfil
En fil som slutar på .py kan användas som en modul.
verktyg.py
Modulens namn är filnamnet utan .py:
verktyg
Filstruktur
Filerna ligger i samma projektmapp
projekt/
├── main.py
└── verktyg.py
main.py startar programmet.
verktyg.py innehåller återanvändbara funktioner.
I detta exempel ligger filerna i samma mapp så att Python hittar modulen.
verktyg.py
Skapa modulen
def hälsa(namn):
print(f"Hej, {namn}!")
def kvadrat(tal):
return tal * tal
Filen definierar två funktioner.
Den behöver inte innehålla programmets meny eller startkod.
main.py
Importera hela modulen
import verktyg
verktyg.hälsa("Ella")
print(verktyg.kvadrat(5))
Skriv inte .py i importen.
Funktionerna används genom verktyg..
Steg för steg
Vad händer vid importen?
- Python hittar filen
verktyg.py. - Modulen görs tillgänglig under namnet
verktyg. verktyg.hälsahämtar funktionen från modulen.verktyg.kvadrathämtar den andra funktionen.
Resultat
Kör main.py
verktyg.hälsa("Ella")
print(verktyg.kvadrat(5))
Hej, Ella!
25
Koden kör funktioner som är definierade i en annan fil.
Tydlighet
Modulnamnet visar ursprunget
verktyg.hälsa("Ella")
verktyg.kvadrat(5)
verktyg. visar direkt vilken modul funktionerna kommer från.
Det är användbart när ett program importerar flera moduler.
Specifik import
Importera bara en funktion
from verktyg import hälsa
hälsa("Leo")
verktygär modulens namn.hälsaär funktionen som importeras.- Funktionen anropas direkt utan
verktyg..
Jämför
Hela modulen eller en funktion
import verktyg
verktyg.hälsa("Ella")
Ursprunget syns i anropet.
from verktyg import hälsa
hälsa("Ella")
Kortare anrop, men modulnamnet syns inte.
Alias
Ge modulen ett kortare namn
import verktyg as v
v.hälsa("Tove")
print(v.kvadrat(4))
v blir modulens namn i den aktuella filen.
Filen på datorn heter fortfarande verktyg.py.
Tre importsätt
Anropet beror på importen
import verktyg
verktyg.hälsa("Anna")
from verktyg import hälsa
hälsa("Anna")
import verktyg as v
v.hälsa("Anna")
Alla tre använder samma funktion från verktyg.py.
Återanvändning
En modul kan användas av flera program
projekt/
├── verktyg.py
├── main.py
└── test_verktyg.py
Både huvudprogrammet och tester kan importera verktyg.
Funktionerna behöver inte kopieras till flera filer.
Projekt
Dela upp ett spel i tre filer
kap3-7-moduler/
├── main.py
├── spelare.py
└── strid.py
spelare.py: klassenPlayer.strid.py: funktioner för striden.main.py: skapar objekt och styr programflödet.
spelare.py
Spelarklassen
class Player:
def __init__(self, name, health):
self.name = name
self.health = health
def take_damage(self, amount):
self.health -= amount
if self.health < 0:
self.health = 0
def is_alive(self):
return self.health > 0
def print_status(self):
print(f"{self.name}: {self.health} hp")
Filen ansvarar för spelarens data och beteende.
strid.py
Funktioner för striden
def attack(attacker, defender, damage):
print(f"{attacker.name} attackerar {defender.name}.")
defender.take_damage(damage)
print(f"{defender.name} tar {damage} skada.")
def print_result(player1, player2):
if player1.is_alive() and player2.is_alive():
print("Båda spelarna är kvar i striden.")
elif player1.is_alive():
print(f"{player1.name} vann.")
elif player2.is_alive():
print(f"{player2.name} vann.")
else:
print("Ingen spelare är kvar.")
Filen använder spelarobjekt men styr själva striden.
main.py
Importera klassen och modulen
from spelare import Player
import strid
player = Player("Oskar", 20)
opponent = Player("Erik", 15)
strid.attack(player, opponent, 6)
strid.attack(opponent, player, 4)
player.print_status()
opponent.print_status()
strid.print_result(player, opponent)
Player importeras direkt. Modulen strid importeras
som helhet.
Ansvar
Varje fil har en tydlig uppgift
spelare.py
Vad en spelare är och kan göra.
strid.py
Hur spelare attackerar och hur resultat visas.
main.py
Vilka objekt som skapas och i vilken ordning saker sker.
Varför?
Fördelar med moduler
- Koden blir lättare att hitta och förstå.
- Varje del kan testas separat.
- Funktioner och klasser kan återanvändas.
- Du slipper kopiera samma kod till flera filer.
- Flera utvecklare kan arbeta med olika delar.
Öva själv
Skapa modulprojektet
- Skapa
spelare.pymed klassenPlayer. - Skapa
strid.pymed stridsfunktionerna. - Skapa
main.pyoch importera båda delarna. - Skapa två spelare och låt dem attackera.
- Skriv ut resultatet.
Sammanfattning
Kom ihåg
- En modul är en Pythonfil som kan importeras.
import modulimporterar hela modulen.from modul import namnimporterar en bestämd del.asskapar ett alias i den aktuella filen.- Moduler ger tydligare ansvar och återanvändbar kod.