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.
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.
- Ieraksti
class Speletajs:un zem tāpass. - Izveido objektu
speletajs1 = Speletajs(). - Izveido otru objektu
speletajs2 = Speletajs(). - Izdrukā abus un apskati, kas parādās.
- Izdrukā
speletajs1 == speletajs2. - 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.
- Ieraksti
speletajs1.vards = "Anna". - Ieraksti
speletajs1.energija = 100. - Piešķir otram objektam vārdu
Jānisun enerģiju 80. - Izdrukā abu objektu vārdus un enerģiju.
- Nomaini pirmā objekta enerģiju uz 50 un izdrukā abus vēlreiz.
- 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.
- Ieraksti klases iekšpusē
maks_energija = 100. - Izdrukā
speletajs1.maks_energijaunspeletajs2.maks_energija. - Nomaini
Speletajs.maks_energija = 120un izdrukā abus vēlreiz. - Pieraksti, vai mainījās abiem objektiem.
- Nomaini tikai
speletajs1.maks_energija = 200un izdrukā abus. - Pieraksti, kas notika šoreiz.
- 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.
- Pievieno klasei atribūtu
skaits = 0. - Palielini to ar
Speletajs.skaits += 1pēc katra objekta izveides. - Izveido piecus objektus.
- Izdrukā
Speletajs.skaits. - 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ņemselfkā pirmo parametru. - Klases atribūta maiņa caur objektu:
p1.maks_energija = 200izveido OBJEKTA atribūtu, nevis maina klases atribūtu. - Klases nosaukums ar mazo burtu: Pēc PEP 8 klases sākas ar lielo burtu (
Speletajs, nevisspeletajs).
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}")
Jānis: 80/100