11.3 Metodes un self

Tavs šīs stundas izaicinājums: Iemācīties rakstīt metodes, kas modificē objekta stāvokli un mijiedarbojas savā starpā.

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

Teorija: Metodes — objekta uzvedība

Klases metode ir funkcija, kas piesieta objektam. Pirmais parametrs vienmēr ir self — atsauce uz objektu, kura metode tiek izsaukta.

class Varonis:
    def __init__(self, vards, hp=100, speks=10):
        self.vards = vards
        self.hp = hp
        self.maks_hp = hp
        self.speks = speks

    def cizt(self, bojajums):
        """Saņem ievainojumu."""
        self.hp = max(0, self.hp - bojajums)
        if self.hp == 0:
            print(f"{self.vards} ir kritis!")

    def uzbrukums(self, merkis):
        """Uzbrūk citam varonim."""
        print(f"{self.vards} uzbrūk {merkis.vards} ar {self.speks} bojājumu!")
        merkis.cizt(self.speks)

    def dziedinas(self, daudzums):
        self.hp = min(self.maks_hp, self.hp + daudzums)

# Lietošana
artur = Varonis("Artūrs", hp=120, speks=15)
orks = Varonis("Orks", hp=60, speks=8)

artur.uzbrukums(orks)  # Artūrs uzbrūk Orks ar 15 bojājumu!
orks.uzbrukums(artur)
artur.dziedinas(20)

Metodes tipi:

1. uzdevums: Pirmās metodes

Pievieno spēlētāja klasei reālas darbības.

Izpildes soļi:

  1. Klasei Speletajs pievieno metodi cizt(self, bojajums), kas atņem HP.
  2. Pievieno dziedinas(self, daudzums), kas pievieno HP, bet ne pāri maks_hp.
  3. Pievieno vai_dzivs(self), kas atgriež True/False atkarībā no HP.
  4. Testē visas trīs metodes ar dažādām vērtībām.

2. uzdevums: Objektu mijiedarbība

Divi objekti var komunicēt savā starpā.

Izpildes soļi:

  1. Pievieno metodi uzbrukums(self, merkis), kas izsauc merkis.cizt(self.speks).
  2. Pievieno self.speks atribūtu konstruktorā.
  3. Izveido divus varoņus un liec viņiem cīnīties (while cikls līdz viens nokrīt).
  4. Pievieno izvades print() par notikumiem.

3. uzdevums: @classmethod un @staticmethod

Apgūsti dekoratoru lomu.

Izpildes soļi:

  1. Pievieno klases metodi: @classmethod def izveidot_orku(cls): return cls("Orks", hp=50, speks=8)
  2. Pievieno statisku metodi: @staticmethod def aprekinat_bojajumu(speks, brunas): return max(1, speks - brunas)
  3. Lieto: orks = Varonis.izveidot_orku() un b = Varonis.aprekinat_bojajumu(15, 5).
  4. Paskaidro, kad katrs no dekoratoriem ir noderīgs.

Papildus uzdevums: Property dekorators

Padari atribūtus pārvaldītus, piemēram, lai HP nevarētu pārsniegt maksimumu.

Izpildes soļi:

  1. @property izveido "viltus" atribūtu, kas iekšēji izpilda kodu.
  2. Pievieno @property def hp(self) un @hp.setter def hp(self, value).
  3. Setteri pārbauda, ka jaunā vērtība ir robežās 0–maks_hp.
  4. Tagad v.hp = -50 automātiski iestatīs 0.

Biežākās kļūdas

Koda piemērs

class Varonis:
    def __init__(self, vards, hp=100, speks=10):
        self.vards = vards
        self.hp = hp
        self.speks = speks

    def cizt(self, b):
        self.hp = max(0, self.hp - b)
        if self.hp == 0:
            print(f"{self.vards} ir miris!")

    def uzbrukums(self, merkis):
        print(f"{self.vards} → {merkis.vards}: {self.speks}")
        merkis.cizt(self.speks)

art = Varonis("Artūrs", 120, 15)
ork = Varonis("Orks", 50, 8)

while art.hp > 0 and ork.hp > 0:
    art.uzbrukums(ork)
    if ork.hp > 0:
        ork.uzbrukums(art)
Artūrs → Orks: 15
Orks → Artūrs: 8
... (cīņa turpinās)
Orks ir miris!
⬅ Iepriekšējā stunda Nākamā stunda ➡