11.2 Konstruktori un atribūti

Tavs šīs stundas izaicinājums: Iemācīties pareizi inicializēt objektus, izmantojot __init__ metodi un noklusējuma argumentus.

SR 2.4.18. Lieto OOP pamatus SR 2.4.15. Modulāras programmas un funkcijas

Teorija: __init__ — objekta dzimšana

Manuāli iestatīt katra objekta atribūtus ir kļūdu pilna pieeja. __init__ ir konstruktors — speciāla metode, ko Python automātiski izsauc, kad veido jaunu objektu.

class Varonis:
    def __init__(self, vards, hp=100, klase="bruninieks"):
        # self ir norāde uz JAUNO objektu
        self.vards = vards
        self.hp = hp
        self.maks_hp = hp
        self.klase = klase
        self.dziva = True

    def info(self):
        return f"{self.vards} ({self.klase}): {self.hp}/{self.maks_hp} HP"

# Izveide ar pozicionāliem argumentiem
v1 = Varonis("Artūrs")
# Izveide ar nosauktiem argumentiem
v2 = Varonis(vards="Merlins", hp=80, klase="burvis")

print(v1.info())  # Artūrs (bruninieks): 100/100 HP
print(v2.info())  # Merlins (burvis): 80/80 HP

Atribūtu tipi:

1. uzdevums: Konstruktors ar parametriem

Pārveido iepriekšējās stundas klasi, lai izmanto __init__.

Izpildes soļi:

  1. Definē class Speletajs ar __init__(self, vards, hp=100).
  2. Konstruktorā saglabā self.vards, self.hp, self.maks_hp.
  3. Izveido 3 spēlētājus ar dažādiem parametriem (viens ar noklusējuma hp).
  4. Pārbaudi, ka katrs ir patstāvīgs (mainot viena hp, otrs nemainās).

2. uzdevums: Validācija konstruktorā

Pievieno argumentu validāciju.

Izpildes soļi:

  1. __init__ sākumā: ja hp <= 0, izmet raise ValueError("HP jābūt pozitīvam").
  2. Ja vārds ir tukšs (not vards), izmet ValueError.
  3. Mēģini izveidot nederīgus objektus — pārliecinies, ka kļūdas paziņojumi ir skaidri.
  4. Pievieno try/except bloku, kurš noķer šīs kļūdas un parāda lietotājam.

3. uzdevums: Vairāki klases atribūti

Eksperimentē ar klases vs objekta atribūtiem.

Izpildes soļi:

  1. Klases līmenī definē: visi_speletaji = [].
  2. Konstruktorā: Speletajs.visi_speletaji.append(self).
  3. Izveido 5 spēlētājus.
  4. Izvada visus: for s in Speletajs.visi_speletaji: print(s.vards).
  5. UZMANĪBA: Maināmi (list) klases atribūti var radīt pārsteigumus — paskaidro klasē, kāpēc.

Papildus uzdevums: @dataclass dekorators

Atklāj Python automātisko klases ģenerēšanu.

Izpildes soļi:

  1. Imports: from dataclasses import dataclass
  2. Definē klasi: @dataclass class Speletajs: vards: str; hp: int = 100
  3. Izveido objektu un izvada — automātiski ir saprātīgs __repr__.
  4. Salīdzini ar manuāli rakstīto klasi.

Biežākās kļūdas

Koda piemērs

class Varonis:
    def __init__(self, vards, hp=100, klase="bruninieks"):
        if hp <= 0:
            raise ValueError("HP jābūt pozitīvam")
        if not vards:
            raise ValueError("Vārds nedrīkst būt tukšs")
        self.vards = vards
        self.hp = hp
        self.maks_hp = hp
        self.klase = klase

v1 = Varonis("Artūrs")
v2 = Varonis(vards="Merlins", hp=80, klase="burvis")
print(f"{v1.vards}: {v1.hp}/{v1.maks_hp}")
print(f"{v2.vards} ({v2.klase}): {v2.hp}/{v2.maks_hp}")
Artūrs: 100/100
Merlins (burvis): 80/80
⬅ Iepriekšējā stunda Nākamā stunda ➡