1 of 24

Viikko 9

OHjelmoinnin JAtkokurssi

5.11.2025

2 of 24

Viime viikolla

Oliot ja viittaukset, kertaus

Omien luokkien kirjoittaminen

Konstruktorit, attribuutit, self

Metodit omissa luokissa

__str__ -metodi

3 of 24

Palautetta viikolta 8

  • Koska tehdään metodi luokan sisään ja koska ulkoinen funktio?
  • __str__ jäi vielä vähän epäselväksi → puhutaan tänään lisää
  • self samoin vielä epäselvä → siitäkin lisää
  • Mikä ihmeen asiakas?
  • Kapselointi vielä vähän epäselvää → …ja tästäkin vielä lisää tänään

4 of 24

Omat oliot tietorakenteissa

Omia olioita voi tallentaa normaalisti listaan:

5 of 24

Omat oliot tietorakenteissa

Metodi __str__ ei toimi listalla olevien alkoiden kanssa, sen sijaan __repr__ toimii

Näillä on kuitenkin semanttinen ero:

__str__ palauttaa olion sisällön ihmiselle luettavassa muodossa, �__repr__ muodossa, jolla voidaan luoda uusi samanlainen olio

6 of 24

Listaan tallennetaan viittauksia

7 of 24

Listaan tallennetaan viittauksia

Tämä tulee vastaan esimerkiksi silloin, kun kopioidaan lista – tämä ei tee uutta kopioita alkioista, vaan ainoastaan uuden listan, johon viittaukset on kopioitu

Jos haluaa kopioida myös listan alkiot, funktio deepcopy modulista copy on mainio apu tähän: https://docs.python.org/3/library/copy.html

8 of 24

Oliot parametreina

Muuttujalla self voidaan viitata olioon itseensä

9 of 24

Oliot attribuutteina

Olioita voidaan tallentaa toisten olioiden sisään

10 of 24

None eli tyhjä viittaus

Avainsanalla None voidaan merkitä viittaus "ei mihinkään"

11 of 24

Kapseloinnista

Luokka tarjoaa asiakkaalle palveluita, jotta

  1. asiakkaan kannalta luokan ja olioiden käyttö on mahdollisimman yksinkertaista ja
  2. olion sisäinen eheys säilyy joka tilanteessa.

12 of 24

Attribuuttien piilottaminen

Luokka voi piilottaa attribuutit asiakkaalta

Tämä tapahtuu kirjoittamalla attribuutin nimen eteen kaksi viivaa

13 of 24

Esimerkiksi

14 of 24

Asetus- ja havainnointi

Piilotettuja attribuutteja varten asiakkaalle voidaan tarjota asetus- ja havainnointimetodit

Huomaa, että kaikille attribuuteille ainakaa molempia ei välttämättä ole tarpeen tarjota

15 of 24

Havainnointimetodi

Merkitään @property-annotaatiolla

Havainnointimetodi pitää esitellä ennen (mahdollista) asetusmetodia

16 of 24

Esimerkki

17 of 24

Asetusmetodi

Asetusmetodi merkitään annotaatiolla @muuttuja.setter, esim:

18 of 24

Koska asetus- ja havainnointimetodit?

Asetus- ja havainnointimetodit tarjotaan kun halutaan mahdollistaa asiakkaalle suora mutta suojattu pääsy attribuutteihin

Usein voidaan käyttää myös muunlaisia metodeita, esim. silloin kun ei haluta antaa tietorakennetta suoraan asiakkaan käsiteltäväksi

19 of 24

Metodien näkyvyys

Kaksi alaviivaa metodin nimen edessä piilottaa myös metodin asiakkaalta

Kutsuessa pitää käyttää self-muuttujaa

20 of 24

Staattiset piirteet

Luokan piirteitä kutsutaan staattisiksi piirteiksi, näitä ovat siis

  • staattiset muuttujat eli luokkamuuttujat
  • staattiset metodit

21 of 24

Staattinen muuttuja

Luokkamuuttujaa voi käyttää ilman että luodaan oliota luokasta

22 of 24

Staattinen metodi

Luokkametodi merkitään annotaatiolla @classmethod, ja sen ensimmäinen (tai ainoa) parametri on aina cls

Luokkametodia kutsutaan luokan nimen avulla:

LuokanNimi.metodi()

23 of 24

Esimerkiksi

24 of 24

Ensi viikolla

Luokkahierarkiat, perintä

Lisää näkyvyysmääreitä

Operaattoreiden ylikuormitus

Omien luokkien iterointi