ebSkola

11.3 Metodes un self

Stundas uzdevums: 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

70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - uzraksti pirmo metodi ar self · 2. uzdevums (~25 min) - liec metodei mainīt objekta stāvokli · 3. uzdevums (~20 min) - pievieno metodi, kas atgriež atbildi. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.

Pirms sāc: atver savu 11.2 stundas klasi Dalibnieks. Atceries: katras metodes pirmais parametrs ir self.

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 Dalibnieks:
    def __init__(self, vards, energija=100, temps=10):
        self.vards = vards
        self.energija = energija
        self.maks_energija = energija
        self.temps = temps

    def sanem_punktus(self, punkti):
        """Saņem punktu izmaiņas."""
        self.energija = max(0, self.energija - punkti)
        if self.energija == 0:
            print(f"{self.vards} pabeidza raundu!")

    def gajiens(self, merkis):
        """Veic gājienu pret citu dalībnieku."""
        print(f"{self.vards} veic gājienu pret {merkis.vards} ar {self.temps} punktiem!")
        merkis.sanem_punktus(self.temps)

    def dziedinas(self, daudzums):
        self.energija = min(self.maks_energija, self.energija + daudzums)

# Lietošana
marta = Dalibnieks("Marta", energija=120, temps=15)
nokavets_zvans = Dalibnieks("Nokavēts zvans", energija=60, temps=8)

marta.gajiens(nokavets_zvans)  # Marta veic gājienu pret Nokavēts zvans ar 15 punktiem!
nokavets_zvans.gajiens(marta)
marta.dziedinas(20)

Metodes tipi:

  • Instances metode - pirmais arg self. Visbiežāk lietotā.
  • @classmethod - pirmais arg cls (klase, nevis objekts).
  • @staticmethod - bez self/cls; vienkārša funkcija klases iekšpusē.

Praktiskie uzdevumi

1. uzdevums -

Uzraksti pirmo metodi ar self

Beigās objekts pats varēs par sevi pastāstīt.

  1. Pievieno klasē def apraksts(self):.
  2. Izdrukā tajā vārdu un enerģiju ar f-string.
  3. Izsauc to ar dalibnieks.apraksts().
  4. Izdzēs parametru self un izsauc vēlreiz.
  5. Pieraksti, kāda kļūda radās.
  6. Ieliec self atpakaļ.

Gatavs, kad: metode izdrukā objekta datus, un bez self rodas TypeError.

2. uzdevums -

Liec metodei mainīt objekta stāvokli

Beigās metode varēs samazināt dalībnieka enerģiju.

  1. Pievieno metodi def sanem_punktus(self, punkti):.
  2. Samazini tajā self.energija = max(0, self.energija - punkti).
  3. Izsauc to ar 30 un izdrukā enerģiju.
  4. Izsauc vēlreiz ar 200 un izdrukā enerģiju.
  5. Pārbaudi, ka enerģija nekļūst negatīva.
  6. Pieraksti, ko dara funkcija max() šajā rindā.

Gatavs, kad: pēc liela trieciena enerģija ir tieši 0, nevis negatīvs skaitlis.

3. uzdevums -

Pievieno metodi, kas atgriež atbildi

Beigās tu varēsi jautāt objektam, vai tas vēl ir spēlē.

  1. Pievieno metodi def vai_aktivs(self):.
  2. Atgriez tajā return self.energija > 0.
  3. Izsauc to pirms un pēc trieciena.
  4. Uzraksti nosacījumu, kas izdrukā ziņu, ja dalībnieks vairs nav aktīvs.
  5. Izveido divus dalībniekus un liec vienam saņemt lielu triecienu.
  6. Izdrukā abu statusu ciklā.
  7. Pieraksti vienu secinājumu: ar ko metode, kas atgriež vērtību, atšķiras no tās, kas tikai izdrukā.

Gatavs, kad: cikls izdrukā, ka viens dalībnieks ir aktīvs, bet otrs - nav.

Papildu uzdevums - Pievieno atjaunošanās metodi

Ja pamatdarbs ir gatavs, ļauj dalībniekam atgūt enerģiju.

  1. Pievieno metodi def atjaunojas(self, daudzums):.
  2. Palielini enerģiju, bet ne virs self.maks_energija.
  3. Izmanto tam funkciju min().
  4. Izsauc to ar lielu skaitli un izdrukā enerģiju.
  5. Pārbaudi, ka enerģija nepārsniedz maksimumu.

Gatavs, kad: pat ar ļoti lielu atjaunošanos enerģija apstājas tieši uz maksimuma.

Biežākās kļūdas

  • Aizmirsts self atribūta priekšā: def sanem_punktus(self, b): energija -= b meklē globālu energija!
  • Atgriež None vietā saraksta vai vērtības: Vienmēr pievērs uzmanību, vai metode jāatgriež kaut kas.
  • Maina objekta atribūtu vietā ievada parametru: def sanem_punktus(self, energija) ievieš lokālu energija!

Koda piemērs

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

    def sanem_punktus(self, b):
        self.energija = max(0, self.energija - b)
        if self.energija == 0:
            print(f"{self.vards} pabeidza raundu!")

    def gajiens(self, merkis):
        print(f"{self.vards} → {merkis.vards}: {self.temps}")
        merkis.sanem_punktus(self.temps)

marta = Dalibnieks("Marta", 120, 15)
nokavets_zvans = Dalibnieks("Nokavēts zvans", 50, 8)

while marta.energija > 0 and nokavets_zvans.energija > 0:
    marta.gajiens(nokavets_zvans)
    if nokavets_zvans.energija > 0:
        nokavets_zvans.gajiens(marta)
Marta → Nokavēts zvans: 15
Nokavēts zvans → Marta: 8
... (turnīrs turpinās)
Nokavēts zvans pabeidza raundu!