2.20. Ensiluokkainen

Luokka ryhmittelee datan ja dataa käsittelevät funktiot yhden nimen alle. Sellaiseen tarttuminen kannattaa, kun useat tilan osat kuuluvat yhteen ja suurin osa skriptin funktioista ottaa argumenteikseen saman joukon arvoja.

2.20.1. class-avainsana

Avainsana on class. Runko sisältää __init__-metodin, joka suoritetaan aina, kun uusi instanssi luodaan:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(3, 4)
print(p.x, p.y)

Tuloste:

3 4

Point on luokka; p on sen instanssi. Kutsun Point(3, 4) sulkeet kutsuvat __init__-metodia, joka sijoittaa argumentit uuden instanssin attribuutteihin. self on instanssin sopimuksenmukainen nimi; self.x asettaa attribuutin, jonka instanssin loput metodit lukevat.

2.20.2. Milloin luokkaa kannattaa käyttää

Tartu luokkaan, kun nämä pitävät paikkansa samanaikaisesti:

  • Kourallinen toisiinsa liittyviä arvoja kulkee kaikkialla yhdessä (pisteen x ja y; sensorilukeman arvo, yksikkö ja aikaleima).

  • Useat funktiot ottavat saman joukon arvoja ja toimivat niiden parissa.

  • On hyödyllistä pitää useampaa kuin yhtä näistä nipuista elossa kerralla, toisistaan erillisinä.

Jos data on kertaluonteista, tavallinen dict tai tuple riittää yleensä. Jos tarvitset vain yhden vakionipun, moduulitason muuttujat käyvät hyvin. Luokat eivät ole oletussäiliö – ne ansaitsevat paikkansa, kun tila ja käyttäytyminen haluavat pysyä yhdessä.

2.20.3. Mitä __init__ tekee

__init__ on vain tavallinen metodi. Kaikki sen sisällä self-olioon sijoitettu muuttuu uuden instanssin attribuutiksi:

class Sensor:
    def __init__(self, name, unit):
        self.name = name
        self.unit = unit
        self.readings = []

temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)

Tuloste:

temperature C []

readings alustetaan tyhjäksi listaksi – jokainen uusi instanssi saa oman listansa, ei jaettua. Kaikki, mitä ei sijoiteta self-olioon, on paikallista __init__-metodille ja katoaa, kun se palaa.