›_ebskola.lv
Prog I · 11. tēma · 6 stundas - Python · OOP · klases

Objektorientētā //
programmēšana

Apgūsti Python class, __init__, mantošanu un polimorfismu. Veido RPG turnīra simulatoru ar cīnītāju hierarhiju.

6 stundas class · mantošana Turnīra simulators
# 01 stundu plāns

6 stundas - klases, mantošana un turnīrs

noslēguma projekts →
class Cīnītājsatribūti:self.vārdsself.hp = 100metodes:def uzbrukt(self, m)Anna(100)Jānis(100)// class
Python · classOOP pamati

Klases un objekti

class kā blueprint, instance kā konkrēts objekts, atribūti un metodes.

11.1 stundaatvērt ↗
Cīnītājs("Anna", hp=80) def __init__(self, vārds, hp): self.vārds = "Anna" self.hp = 80self = šis konkrētais objekts// __init__
__init__ · selfkonstruktors

Konstruktori un atribūti

__init__ inicializācijas metode, self pašatsauce, instance vs klases atribūti.

11.2 stundaatvērt ↗
anna = Cīnītājs("Anna")anna.uzbrukt(jānis)→ jānis.hp -= 10anna.dziedināt(20)→ self.hp += 20str(anna) → __str__(self)// metodes
metodes · selfmetodes

Metodes un self

Instance metodes, self kā pirmais parametrs, metožu izsaukšana, __str__.

11.3 stundaatvērt ↗
Cīnītājs (bāze)Maģis(Cīnītājs)Karavīrs(Cīnītājs)Archers(Cīnītājs)super().__init__(vārds, hp)// mantošana
mantošana · super()hierarhija

Mantošana un super()

class Maģis(Cīnītājs), super().__init__(), metodes mantošana un paplašināšana.

11.4 stundaatvērt ↗
maģis.uzbrukt(e)kaitē: 20karavīrs.uzbrukt(e)kaitē: 15Polimorfisms: viena metode, dažāds rezultāts__str__ · __repr__ · __eq__ · __len__// polimorfisms
polimorfismsdunder

Polimorfisms un dunder metodes

Metodes override, isinstance(), dunder metodes: __str__, __eq__, __len__.

11.5 stundaatvērt ↗
Anna (Maģis)Jānis (Karavīrs)⚔Kārta 4: Anna uzvar!4 cīnītāji → 2 pusfināli → 1 uzvarētājs$ python turniirs.py
Python · OOPprojekts

Noslēguma projekts: Turnīra simulators

Cīnītāju klašu hierarhija, kaujas simulācija, turnīra kārtu sistēma, rezultātu vizualizācija.

11.6 projektsatvērt ↗
# 02 špikeris

11. tēmas špikeris - objektorientētā programmēšana

Klases, konstruktori, metodes, mantošana un polimorfisms. Katrs bloks atbilst vienai stundai.

11.1 Klase un objekts

# Klase = veidne (cepuma forma). Objekts = eksemplārs (cepums).

class Speletajs:
    maks_energija = 100        # KLASES atribūts - kopīgs visiem objektiem

speletajs1 = Speletajs()       # objekts
speletajs2 = Speletajs()

speletajs1.vards = "Anna"      # OBJEKTA atribūts - tikai šim objektam
speletajs2.vards = "Jānis"

speletajs1.vards               # "Anna"  - otram nemainījās

Speletajs.maks_energija = 120  # mainās ABIEM objektiem
speletajs1.maks_energija = 200 # mainās TIKAI pirmajam

print(speletajs1 == speletajs2)   # False - divi dažādi objekti

Klases atribūts pieder visiem, objekta atribūts - vienam. Skaitītājam, cik objektu izveidots, vajag klases atribūtu.

11.2 Konstruktors __init__

class Dalibnieks:
    def __init__(self, vards, energija=100, klase="kapteinis"):
        # self = norāde uz JAUNO objektu, vienmēr pirmais parametrs
        if energija <= 0:
            raise ValueError("Enerģijai jābūt pozitīvai")
        if not vards:
            raise ValueError("Vārds nedrīkst būt tukšs")

        self.vards = vards
        self.energija = energija
        self.maks_energija = energija      # atceramies sākuma vērtību
        self.klase = klase

d1 = Dalibnieks("Anna")                    # noklusējumi: 100, "kapteinis"
d2 = Dalibnieks("Jānis", 80, "prezentētājs")

# Dalibnieks()          -> TypeError: trūkst arguments 'vards'
# Dalibnieks("X", -5)   -> ValueError: tava paša pārbaude

Pārbaudi liec konstruktorā - tad neviens objekts vispār nevar rasties nederīgs.

11.3 Metodes un self

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

    def sanem_punktus(self, punkti):          # MAINA objekta stāvokli
        self.energija = max(0, self.energija - punkti)

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

    def vai_aktivs(self):                     # ATGRIEŽ atbildi
        return self.energija > 0

    def apraksts(self):
        print(f"{self.vards}: {self.energija} enerģija")

d = Dalibnieks("Anna")
d.sanem_punktus(30)      # Python pats padod objektu kā self
d.vai_aktivs()           # True

# Aizmirsts self definīcijā -> TypeError: takes 0 positional arguments

max(0, ...) un min(maks, ...) ir īsākais veids, kā noturēt vērtību robežās.

11.4 Mantošana un super()

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

class Kapteinis(Dalibnieks):              # manto visu no Dalibnieks
    def __init__(self, vards):
        super().__init__(vards, energija=120)   # izsauc VECĀKA konstruktoru
        self.loma = "kapteinis"                 # savs papildinājums

    def sauklis(self):                          # sava metode
        print(f"{self.vards}: komanda gatava!")

k = Kapteinis("Anna")
k.vai_aktivs()          # strādā - mantots no vecāka
isinstance(k, Dalibnieks)   # True

# Bez super().__init__() -> AttributeError: nav 'vards'

Mantošana ietaupa kopēšanu: kopīgais dzīvo vecākklasē, atšķirīgais - bērnos.

11.5-11.6 Polimorfisms un dunder metodes

class Dalibnieks:
    def runa(self):  print("Dalībnieks runā vispārīgi.")
    def __str__(self):  return f"{self.vards} ({self.energija})"
    def __repr__(self): return f"Dalibnieks({self.vards!r})"
    def __lt__(self, cits): return self.energija < cits.energija

class Kapteinis(Dalibnieks):
    def runa(self):  print("Komanda gatava!")      # pārraksta

class Prezentetajs(Dalibnieks):
    def runa(self):  print("Slaids ir gatavs!")

# Polimorfisms: viens cikls, dažāda uzvedība
for d in [Kapteinis("Anna"), Prezentetajs("Jānis")]:
    d.runa()                # katrs runā savādāk, cikls to nezina

print(d)          # lieto __str__   - cilvēkam
print([d])        # lieto __repr__  - programmētājam
sorted(saraksts)  # lieto __lt__    - bez tā TypeError

Pievienojot ceturto lomu, cikls nav jāmaina - tā ir polimorfisma galvenā vērtība.

$ python turniirs.py # OOP klases simulē RPG cīnītāju turnīru