11.3 Metodes un self
Stundas uzdevums: Iemācīties rakstīt metodes, kas modificē objekta stāvokli un mijiedarbojas savā starpā.
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.
- Pievieno klasē
def apraksts(self):. - Izdrukā tajā vārdu un enerģiju ar f-string.
- Izsauc to ar
dalibnieks.apraksts(). - Izdzēs parametru
selfun izsauc vēlreiz. - Pieraksti, kāda kļūda radās.
- Ieliec
selfatpakaļ.
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.
- Pievieno metodi
def sanem_punktus(self, punkti):. - Samazini tajā
self.energija = max(0, self.energija - punkti). - Izsauc to ar 30 un izdrukā enerģiju.
- Izsauc vēlreiz ar 200 un izdrukā enerģiju.
- Pārbaudi, ka enerģija nekļūst negatīva.
- 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ē.
- Pievieno metodi
def vai_aktivs(self):. - Atgriez tajā
return self.energija > 0. - Izsauc to pirms un pēc trieciena.
- Uzraksti nosacījumu, kas izdrukā ziņu, ja dalībnieks vairs nav aktīvs.
- Izveido divus dalībniekus un liec vienam saņemt lielu triecienu.
- Izdrukā abu statusu ciklā.
- 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.
- Pievieno metodi
def atjaunojas(self, daudzums):. - Palielini enerģiju, bet ne virs
self.maks_energija. - Izmanto tam funkciju
min(). - Izsauc to ar lielu skaitli un izdrukā enerģiju.
- 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
selfatribūta priekšā:def sanem_punktus(self, b): energija -= bmeklē globāluenergija! - 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āluenergija!
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)
Nokavēts zvans → Marta: 8
... (turnīrs turpinās)
Nokavēts zvans pabeidza raundu!