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)
(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:
<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)
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)
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.
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())
3 ulkoilu 2 3 treffit opiskelu 1 0
Vastaa lopuksi osion loppukyselyyn:
Log in to view the quiz