ebSkola

11.1 Klases un objekti

Stundas uzdevums: Saprast, kas ir klase, objekts un kā tās atšķiras no vienkāršām vārdnīcām.

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

70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - izveido pirmo klasi un divus objektus · 2. uzdevums (~25 min) - pievieno atribūtus katram objektam · 3. uzdevums (~20 min) - salīdzini klases un objekta atribūtus. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.

Pirms sāc: atver VS Code un izveido failu klases.py. Šajā stundā vēl nelietosim __init__ - atribūtus piešķirsi ar roku, lai redzētu, cik tas ir neērti.

Teorija: Klase = veidne, objekts = eksemplārs

Klase ir veidne (kā cepuma forma), no kuras var izveidot daudzus objektus (cepumus). Katrs objekts ir patstāvīgs un var saturēt dažādas vērtības, bet visiem ir vienāda struktūra un metodes.

class KlasesKomanda:
    """Klases komandas veidne."""
    pass  # tukša klase - tikai pamatstruktūra

# Objektu izveide
komanda_a = KlasesKomanda()
komanda_b = KlasesKomanda()

print(type(komanda_a))  # <class '__main__.Suns'>
print(komanda_a is komanda_b)  # False - divi atšķirīgi objekti

Kāpēc izvēlēties klasi pār vārdnīcu? Klases nodrošina:

  • Tipa drošību - IDE saprot, kādi atribūti un metodes ir pieejami.
  • Uzvedību - metodes, kas darbojas ar objekta datiem.
  • Mantošanu - viegli izveidot specializētas klases (KlasesKomanda → PrezentacijasKomanda).

Praktiskie uzdevumi

1. uzdevums -

Izveido pirmo klasi un divus objektus

Beigās tev būs divi patstāvīgi objekti no vienas veidnes.

  1. Ieraksti class Speletajs: un zem tā pass.
  2. Izveido objektu speletajs1 = Speletajs().
  3. Izveido otru objektu speletajs2 = Speletajs().
  4. Izdrukā abus un apskati, kas parādās.
  5. Izdrukā speletajs1 == speletajs2.
  6. Pieraksti, kāpēc divi vienādi izveidoti objekti nav vienādi.

Gatavs, kad: izvadē redzamas divas atšķirīgas atmiņas adreses, un salīdzinājums dod False.

2. uzdevums -

Pievieno atribūtus katram objektam

Beigās katrs objekts glabās savus datus.

  1. Ieraksti speletajs1.vards = "Anna".
  2. Ieraksti speletajs1.energija = 100.
  3. Piešķir otram objektam vārdu Jānis un enerģiju 80.
  4. Izdrukā abu objektu vārdus un enerģiju.
  5. Nomaini pirmā objekta enerģiju uz 50 un izdrukā abus vēlreiz.
  6. Pārbaudi, vai otrā objekta enerģija mainījās.

Gatavs, kad: mainot viena objekta enerģiju, otrā paliek nemainīga.

3. uzdevums -

Salīdzini klases un objekta atribūtus

Beigās tu zināsi, kurš atribūts pieder visiem, bet kurš vienam.

  1. Ieraksti klases iekšpusē maks_energija = 100.
  2. Izdrukā speletajs1.maks_energija un speletajs2.maks_energija.
  3. Nomaini Speletajs.maks_energija = 120 un izdrukā abus vēlreiz.
  4. Pieraksti, vai mainījās abiem objektiem.
  5. Nomaini tikai speletajs1.maks_energija = 200 un izdrukā abus.
  6. Pieraksti, kas notika šoreiz.
  7. Pieraksti vienu secinājumu: ar ko klases atribūts atšķiras no objekta atribūta.

Gatavs, kad: mainot klases atribūtu, mainās abiem objektiem, bet mainot objekta atribūtu - tikai vienam.

Papildu uzdevums - Saskaiti izveidotos objektus

Ja pamatdarbs ir gatavs, liec klasei skaitīt savus objektus.

  1. Pievieno klasei atribūtu skaits = 0.
  2. Palielini to ar Speletajs.skaits += 1 pēc katra objekta izveides.
  3. Izveido piecus objektus.
  4. Izdrukā Speletajs.skaits.
  5. Pieraksti, kāpēc šis skaitītājs ir klases, nevis objekta atribūts.

Gatavs, kad: pēc piecu objektu izveides skaitītājs rāda 5.

Biežākās kļūdas

  • Aizmirsts self: Klašu metodes vienmēr saņem self kā pirmo parametru.
  • Klases atribūta maiņa caur objektu: p1.maks_energija = 200 izveido OBJEKTA atribūtu, nevis maina klases atribūtu.
  • Klases nosaukums ar mazo burtu: Pēc PEP 8 klases sākas ar lielo burtu (Speletajs, nevis speletajs).

Koda piemērs

class Speletajs:
    """Vienkāršs turnīrātāja modelis."""
    maks_energija = 100  # klases atribūts

speletajs1 = Speletajs()
speletajs1.vards = "Anna"
speletajs1.energija = 100

speletajs2 = Speletajs()
speletajs2.vards = "Jānis"
speletajs2.energija = 80

print(f"{speletajs1.vards}: {speletajs1.energija}/{Speletajs.maks_energija}")
print(f"{speletajs2.vards}: {speletajs2.energija}/{Speletajs.maks_energija}")
Anna: 100/100
Jānis: 80/100