Tavs šīs stundas izaicinājums: Apgūt klašu hierarhiju, izveidojot specializētas bērna klases ar mantotu un papildinātu uzvedību.
Mantošana ļauj izveidot specializētas klases no vispārējām. Vecāku klase satur kopīgo loģiku, bērna klase pievieno specifisko.
class Varonis:
def __init__(self, vards, hp=100, speks=10):
self.vards = vards
self.hp = hp
self.speks = speks
def uzbrukums(self, merkis):
merkis.hp -= self.speks
class Burvis(Varonis):
def __init__(self, vards, mana=50):
# Izsauc vecāku konstruktoru
super().__init__(vards, hp=80, speks=5)
self.mana = mana # papildu atribūts
def burvojums(self, merkis):
if self.mana >= 10:
self.mana -= 10
merkis.hp -= 25
print(f"{self.vards} izšauj uguni! ({merkis.vards} -25)")
else:
print("Nepietiek manas!")
class Bruninieks(Varonis):
def __init__(self, vards):
super().__init__(vards, hp=150, speks=18)
self.brunas = 5
# Pārraksta vecāku metodi (override)
def cizt(self, b):
b = max(0, b - self.brunas) # bruņas absorbē
super().cizt(b)
m = Burvis("Merlins")
b = Bruninieks("Lanselots")
m.burvojums(b)
isinstance(m, Varonis) atgriež True, jo Burvis ir Varonis.
Izveido vienkāršu klases hierarhiju.
Varonis no iepriekšējām stundām.class Bruninieks(Varonis), kas izsauc super().__init__(vards, hp=150, speks=18).self.brunas = 5 atribūtu.uzbrukums() metode strādā.Izmaina vecāku uzvedību bērnu klasē.
Bruninieks pievieno def cizt(self, b), kas atņem self.brunas no bojājuma.super().cizt(jaunais_bojajums).Strelnieks(Varonis) ar augstāku speks, bet zemu hp.Veido klašu koku ar 3 līmeņiem.
class Burvis(Varonis) ar self.mana.class UgunsBurvis(Burvis), kas pievieno spēju uguns_lietus, kas izšauj 50 bojājumu, bet patērē 25 manas.isinstance(ub, Varonis) un isinstance(ub, Burvis) — abi True.UgunsBurvis manto gan Burvis, gan Varonis metodes.Klase manto no vairākām vecāku klasēm.
class Lidotajs ar metodi lidot().class Pukis(Varonis, Lidotajs).uzbrukums(), gan lidot().print(Pukis.__mro__) — kā Python meklē metodes.super().method().class Varonis:
def __init__(self, vards, hp=100, speks=10):
self.vards = vards
self.hp = hp
self.speks = speks
class Bruninieks(Varonis):
def __init__(self, vards):
super().__init__(vards, hp=150, speks=18)
self.brunas = 5
def cizt(self, b):
b = max(0, b - self.brunas)
self.hp = max(0, self.hp - b)
print(f"{self.vards} bruņas absorbēja, atlikušais {self.hp} HP")
bruno = Bruninieks("Lanselots")
bruno.cizt(20) # bruņas absorbē 5 → faktiski 15 bojājuma
print(f"isinstance(bruno, Varonis) = {isinstance(bruno, Varonis)}")