›_ ebskola.lv
← 11.3 11.5 →

11.4 Mantošana un super()

Stundas uzdevums: Apgūt klašu hierarhiju, izveidojot specializētas bērna klases ar mantotu un papildinātu uzvedību.

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

70 min darba sadalījums: 1. uzdevums (~20 min) - atjauno teorijas piemēru vai minimālo prototipu; 2. uzdevums (~25 min) - pielieto to galvenajā uzdevumā; 3. uzdevums (~25 min) - pārbaudi rezultātu, izlabo kļūdas un tikai beigās pieraksti vienu secinājumu. Papildus/4. līmeņa uzdevums ir paredzēts tikai tad, ja pamatdarbs ir pabeigts.

Pirms sāc: izmanto iepriekš apgūto un šīs lapas teorijas/koda piemērus. Ja vajadzīga jauna komanda vai rīks, vispirms atrodi tās paraugu teorijas sadaļā.

Teorija: Mantošana - kods atkārtoti lietojams

Mantošana ļauj izveidot specializētas klases no vispārējām. Vecāku klase satur kopīgo loģiku, bērna klase pievieno specifisko.

class Dalibnieks:
    def __init__(self, vards, energija=100, temps=10):
        self.vards = vards
        self.energija = energija
        self.temps = temps

    def gajiens(self, merkis):
        merkis.energija -= self.temps

class Prezentetajs(Dalibnieks):
    def __init__(self, vards, idejas=50):
        # Izsauc vecāku konstruktoru
        super().__init__(vards, energija=80, temps=5)
        self.idejas = idejas  # papildu atribūts

    def prezentacija(self, merkis):
        if self.idejas >= 10:
            self.idejas -= 10
            merkis.energija -= 25
            print(f"{self.vards} parāda slaidu! ({merkis.vards} -25)")
        else:
            print("Pietrūkst ideju!")

class Kapteinis(Dalibnieks):
    def __init__(self, vards):
        super().__init__(vards, energija=150, temps=18)
        self.stabilitate = 5

    # Pārraksta vecāku metodi (override)
    def sanem_punktus(self, b):
        b = max(0, b - self.stabilitate)  # stabilitāte mazina punktu zudumu
        super().sanem_punktus(b)

m = Prezentetajs("Jānis")
b = Kapteinis("Anna")
m.prezentacija(b)

isinstance(m, Dalibnieks) atgriež True, jo Prezentetajs ir Dalibnieks.

Praktiskie uzdevumi

1. uzdevums - Iesildies ar gatavu piemēru

Šis ir īss iesildīšanās uzdevums. Nokopē sagatavi, ielīmē to pareizajā koda vietā un palaid. Šeit pietiek droši izmēģināt tēmu 11.4 Mantošana un super(); detalizētu izpratni veidosi nākamajos uzdevumos.

Kopējamais piemērs vai sagatave: izmanto šo bloku kā starta punktu, nevis kā gala risinājumu.

class Dalibnieks:
    def __init__(self, vards, energija=100, temps=10):
        self.vards = vards
        self.energija = energija
        self.temps = temps

    def gajiens(self, merkis):
        merkis.energija -= self.temps

class Prezentetajs(Dalibnieks):
    def __init__(self, vards, idejas=50):
        # Izsauc vecāku konstruktoru
        super().__init__(vards, energija=80, temps=5)
        self.idejas = idejas  # papildu atribūts

    def prezentacija(self, merkis):
        if self.idejas >= 10:
            self.idejas -= 10
            merkis.energija -= 25
            print(f"{self.vards} parāda slaidu! ({merkis.vards} -25)")
        else:
            print("Pietrūkst ideju!")

class Kapteinis(Dalibnieks):
    def __init__(self, vards):
        super().__init__(vards, energija=150, temps=18)
        self.stabilitate = 5

    # Pārraksta vecāku metodi (override)
    def sanem_punktus(self, b):
        b = max(0, b - self.stabilitate)  # stabilitāte mazina punktu zudumu
        super().sanem_punktus(b)

m = Prezentetajs("Jānis")
b = Kapteinis("Anna")
m.prezentacija(b)
  1. Atver darba failu vai rīku. Python fragmentu ievieto main.py failā un palaid no termināļa.
  2. Nokopē visu piemēra bloku no šī uzdevuma un ielīmē to norādītajā vietā.
  3. Palaid kodu tieši tādu, kāds tas ir, un pārliecinies, ka parādās rezultāts, izvade vai vismaz nav kļūdas paziņojuma.
  4. Atrodi vienu drošu vietu, ko drīkst mainīt: tekstu, skaitli, krāsu, mainīgā vērtību vai testa ierakstu.
  5. Maini tikai šo vienu vērtību un palaid kodu vēlreiz.
  6. Salīdzini rezultātu pirms un pēc izmaiņas. Ja parādās kļūda, atcel pēdējo izmaiņu un palaid vēlreiz.
  7. Turpini pie 2. uzdevuma tikai tad, kad šis mazais piemērs darbojas.

2. uzdevums - Ievieto OOP algoritmu projektā

Pievieno šīs stundas objektorientēto paņēmienu kā nelielu, strādājošu projekta daļu.

  1. Izvēlies vienu projekta būtību, ko var modelēt ar objektu: spēlētāju, komandu, rezultātu, kartīti, jautājumu vai turnīra raundu.
  2. Nosauc klasi, atribūtus un metodes pēc to lomas, piemēram, Speletajs, punkti vai pievieno_punktu().
  3. Uzraksti metodi, kas maina objekta stāvokli vai aprēķina rezultātu.
  4. Savieno objektu ar esošo projekta ciklu, ievadi, datiem vai rezultāta izvadi.
  5. Pievieno vienu īsu komentāru pie sarežģītākās OOP loģikas vietas.
  6. Pārbaudi, ka vecais kods joprojām darbojas pēc klases pievienošanas.
  7. Salabo pirmo atrasto kļūdu pirms pievieno nākamo metodi.
  8. Veic Git commit ar īsu ziņu par pievienoto klasi vai metodi.

3. uzdevums - Testē objektus un izdari secinājumu

Pārbaudi, vai objekti un metodes darbojas paredzami.

  1. Izveido trīs testa scenārijus: parasts objekts, robežgadījums un kļūdaini vai tukši dati.
  2. Palaid parasto scenāriju un pārbaudi rezultātu terminālī.
  3. Palaid robežgadījumu ar mazāko, lielāko vai tukšāko vērtību, ko objekts var saņemt.
  4. Palaid kļūdaino scenāriju un pārbaudi, vai programma neavarē.
  5. Izlabo vienu konkrētu problēmu klasē, metodē vai objektu sasaistē.
  6. Pārbaudi labojumu vēlreiz ar visiem trim scenārijiem.
  7. Beigās pieraksti vienu secinājumu: kura klase, metode vai objekta stāvokļa maiņa vislabāk palīdzēja saprast tēmu 11.4 Mantošana un super().

Papildu uzdevums - Pievieno mazu OOP uzlabojumu

Ja pamatdarbs ir pabeigts, paplašini projektu ar vienu nelielu objektorientētu uzlabojumu.

  1. Izvēlies vienu mazu papildinājumu, kas izmanto to pašu šīs stundas paņēmienu.
  2. Pievieno vienu jaunu atribūtu, metodi, objektu sarakstu vai pārbaudes nosacījumu.
  3. Savieno papildinājumu ar esošo projekta kodu.
  4. Pārbaudi, ka pamatklase un papildinājums darbojas kopā.
  5. Saglabā izmaiņas ar Git commit tikai pēc veiksmīgas pārbaudes.

Biežākās kļūdas

Koda piemērs

class Dalibnieks:
    def __init__(self, vards, energija=100, temps=10):
        self.vards = vards
        self.energija = energija
        self.temps = temps

class Kapteinis(Dalibnieks):
    def __init__(self, vards):
        super().__init__(vards, energija=150, temps=18)
        self.stabilitate = 5

    def sanem_punktus(self, b):
        b = max(0, b - self.stabilitate)
        self.energija = max(0, self.energija - b)
        print(f"{self.vards} stabilitāte mazināja punktu zudumu; atlikusī enerģija {self.energija}")

anna = Kapteinis("Anna")
anna.sanem_punktus(20)  # stabilitāte samazina zudumu par 5 punktiem
print(f"isinstance(anna, Dalibnieks) = {isinstance(anna, Dalibnieks)}")
Anna stabilitāte mazināja punktu zudumu; atlikusī enerģija 135
isinstance(anna, Dalibnieks) = True
⬅ Iepriekšējā stunda Nākamā stunda ➡