Presentationer Slide 1/1

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?

  1. Python hittar filen verktyg.py.
  2. Modulen görs tillgänglig under namnet verktyg.
  3. verktyg.hälsa hämtar funktionen från modulen.
  4. verktyg.kvadrat hä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: klassen Player.
  • 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

  1. Skapa spelare.py med klassen Player.
  2. Skapa strid.py med stridsfunktionerna.
  3. Skapa main.py och importera båda delarna.
  4. Skapa två spelare och låt dem attackera.
  5. Skriv ut resultatet.

Sammanfattning

Kom ihåg

  • En modul är en Pythonfil som kan importeras.
  • import modul importerar hela modulen.
  • from modul import namn importerar en bestämd del.
  • as skapar ett alias i den aktuella filen.
  • Moduler ger tydligare ansvar och återanvändbar kod.