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 - klases, mantošana un turnīrs
Klases un objekti
class kā blueprint, instance kā konkrēts objekts, atribūti un metodes.
Konstruktori un atribūti
__init__ inicializācijas metode, self pašatsauce, instance vs klases atribūti.
Metodes un self
Instance metodes, self kā pirmais parametrs, metožu izsaukšana, __str__.
Mantošana un super()
class Maģis(Cīnītājs), super().__init__(), metodes mantošana un paplašināšana.
Polimorfisms un dunder metodes
Metodes override, isinstance(), dunder metodes: __str__, __eq__, __len__.
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. 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.