Osa 8

Lisää esimerkkejä

Esimerkki 1: Luokka Suorakulmio

Tarkastellaan seuraavaksi luokkaa, joka mallintaa suorakulmiota kaksiulotteisessa koordinaatistossa:

class Suorakulmio:
    def __init__(self, vasen_ylakulma: tuple, oikea_alakulma: tuple):
        self.vasen_ylakulma = vasen_ylakulma
        self.oikea_alakulma = oikea_alakulma
        self.leveys = oikea_alakulma[0]-vasen_ylakulma[0]
        self.korkeus = oikea_alakulma[1]-vasen_ylakulma[1]

    def pinta_ala(self):
        return self.leveys * self.korkeus

    def piiri(self):
        return self.leveys * 2 + self.korkeus * 2

    def siirra(self, x_muutos: int, y_muutos: int):
        kulma = self.vasen_ylakulma
        self.vasen_ylakulma = (kulma[0]+x_muutos, kulma[1]+y_muutos)
        kulma = self.oikea_alakulma
        self.oikea_alakulma = (kulma[0]+x_muutos, kulma[1]+y_muutos)

Kun suorakulmio luodaan, konstruktorille annetaan kaksi tuplea: vasemman yläkulman ja oikean alakulman sijainti (x- ja y-koordinaatit). Konstruktori laskee tämän perusteella suorakulmion leveyden ja korkeuden.

Metodit pinta_ala ja piiri laskevat suorakulmion pinta-alan ja piirin korkeuden ja leveyden perusteella. Metodi siirra puolestaan siirtää suorakulmiota koordinaatistossa annetun verran x- ja y-suunnissa.

Huomaa, että suorakulmio esitetään koordinaatistossa, jossa x-koordinaatit kasvavat vasemmalta oikealle ja y-koordinaatit kasvavat ylhäältä alaspäin. Tämä on usein käytetty koordinaatisto ohjelmoinnissa, koska on luontevaa esittää tietokoneen näyttö niin, että vasemman yläkulman x- ja y-koordinaatti on 0.

Seuraava koodi testaa luokkaa:

suorakulmio = Suorakulmio((1, 1), (4, 3))
print(suorakulmio.vasen_ylakulma)
print(suorakulmio.oikea_alakulma)
print(suorakulmio.leveys)
print(suorakulmio.korkeus)
print(suorakulmio.piiri())
print(suorakulmio.pinta_ala())

suorakulmio.siirra(3, 3)
print(suorakulmio.vasen_ylakulma)
print(suorakulmio.oikea_alakulma)
Esimerkkitulostus

(1, 1) (4, 3) 3 2 10 6 (4, 4) (7, 6)

Olion tulostaminen

Kun omasta luokasta luotu olio tulostetaan sellaisenaan print-komennolla, lopputulos ei ole kovin selkeä:

suorakulmio = Suorakulmio((1, 1), (4, 3))
print(suorakulmio)

Ohjelma tulostaa jotain seuraavankaltaista:

Esimerkkitulostus

<main.Suorakulmio object at 0x000002D7BF148A90>

Järkevämpi tulostus saadaan lisäämällä luokkaan metodi __str__, joka palauttaa ymmärrettävän kuvauksen olion tilasta merkkijonona. Kun tämä metodi on määritelty, metodin palauttama kuvaus oliosta tulee näkyviin print-komennossa.

Lisätään luokkaan Suorakulmio metodi __str__:

class Suorakulmio:

    # Luokan muu sisältö tähän kuten ennenkin...

    # Metodi palauttaa olion tilan merkkijonona
    def __str__(self):
        return f"suorakulmio {self.vasen_ylakulma} ... {self.oikea_alakulma}"

Nyt print-komento tuottaa luettavan lopputuloksen:

suorakulmio = Suorakulmio((1, 1), (4, 3))
print(suorakulmio)
Esimerkkitulostus

suorakulmio (1, 1) ... (4, 3)

Metodia __str__ kutsutaan yleisemmin silloin, kun oliosta muodostetaan merkkijonokuvaus str-funktiolla. Seuraava koodi esittelee asiaa:

suorakulmio = Suorakulmio((1, 1), (4, 3))
kuvaus = str(suorakulmio)
print(kuvaus)
Esimerkkitulostus

suorakulmio (1, 1) ... (4, 3)

Metodin __str__ lisäksi olioon voidaan määritellä samantapainen metodi __repr__, joka antaa teknisen kuvauksen olion tilasta. Tutustumme tähän metodiin tarkemmin myöhemmin.

Loading
Loading
Loading

Esimerkki 2: Tehtävälista

Seuraava luokka Tehtavalista toteuttaa tehtävälistan:

class Tehtavalista:
    def __init__(self):
        self.tehtavat = []

    def lisaa(self, nimi: str, prioriteetti: int):
        self.tehtavat.append((prioriteetti, nimi))

    def hae_seuraava(self):
        self.tehtavat.sort()
        # Metodi pop poistaa ja palauttaa listan viimeisen alkion
        tehtava = self.tehtavat.pop()
        # Palautetaan tuplen jälkimmäinen osa eli tehtävän nimi
        return tehtava[1]

    def yhteensa(self):
        return len(self.tehtavat)

    def tyhjenna(self):
        self.tehtavat = []

Metodi lisaa lisää listalle uuden tehtävän tietyllä prioriteetilla ja metodi hae_seuraava poistaa ja palauttaa listan suurimman prioriteetin tehtävän. Lisäksi metodi yhteensa antaa listan tehtävien yhteismäärän ja metodi tyhjenna tyhjentää listan.

Tehtäviä säilytetään sisäisesti listassa, jossa on tuplena kunkin tehtävän prioriteetti ja nimi. Prioriteetti tallennetaan ensin, jolloin tärkein tehtävä on listan lopussa listan järjestämisen jälkeen. Tämän ansiosta tehtävän saa haettua ja poistettua listalta kätevästi pop-metodilla.

Seuraava koodi esittelee luokan käyttämistä:

lista = Tehtavalista()
lista.lisaa("opiskelu", 50)
lista.lisaa("ulkoilu", 60)
lista.lisaa("siivous", 10)
print(lista.yhteensa())
print(lista.hae_seuraava())
print(lista.yhteensa())
lista.lisaa("treffit", 100)
print(lista.yhteensa())
print(lista.hae_seuraava())
print(lista.hae_seuraava())
print(lista.yhteensa())
lista.tyhjenna()
print(lista.yhteensa())
Esimerkkitulostus

3 ulkoilu 2 3 treffit opiskelu 1 0

Loading

Vastaa lopuksi osion loppukyselyyn:

:
Loading...
:
Loading...

Log in to view the quiz