Tavs šīs stundas izaicinājums: Izprast polimorfismu un Python speciālās ("dunder") metodes objektu pielāgošanai.
Polimorfisms = daudzas formas. Dažādas klases ar to pašu metodes nosaukumu, bet atšķirīgu uzvedību.
class Varonis:
def runa(self): print("Varonis runā vispārīgi.")
class Burvis(Varonis):
def runa(self): print("Magicāli vārdi!")
class Bruninieks(Varonis):
def runa(self): print("Par godu un karaļa zemi!")
# Polimorfisms — vienots interfeiss, dažāda uzvedība
for v in [Varonis(), Burvis(), Bruninieks()]:
v.runa()
Dunder metodes (double underscore) ir iebūvētie āķi, kas ļauj klasei darboties ar Python operatoriem un funkcijām:
| Metode | Aktivizē |
|---|---|
__str__ | str(o) un print(o) |
__repr__ | repr(o), REPL izvade |
__eq__ | o1 == o2 |
__lt__, __gt__ | <, > (sortēšana) |
__add__ | o1 + o2 |
__len__ | len(o) |
__contains__ | x in o |
Vairāku klašu kopīga metode.
Ienaidnieks ar metodi uzbrukt(self, merkis), kas izvada vispārīgu ziņojumu.Goblins, Pukis, Skelets — katrs pārraksta uzbrukt() ar savu stilu.ienaidnieki = [Goblins(), Pukis(), Skelets()].for e in ienaidnieki: e.uzbrukt(varonis) — viens kods, dažāda uzvedība.Padari savus objektus skaisti izvadāmus.
Varonis pievieno def __str__(self): return f"{self.vards} ({self.hp} HP)".def __repr__(self): return f"Varonis({self.vards!r}, hp={self.hp})".print(varonis) izsauc __str__, ievada Python REPL — __repr__.print([v1, v2]) — kura metode tiek izsaukta?Padari objektus salīdzināmus.
def __eq__(self, other): return self.hp == other.hp.def __lt__(self, other): return self.hp < other.hp.sorted(saraksts).min(saraksts).__hash__ = None, ja klase ir maināma (lai netiktu lietota kā vārdnīcas atslēga).Pielāgo + operatoru savai klasei.
Vektors ar x, y atribūtiem.def __add__(self, other): return Vektors(self.x + other.x, self.y + other.y).+ operatoru.__sub__ un __mul__.str, citādi TypeError.__hash__ = None.__lt__, __eq__ — vienmēr return True/False.class Varonis:
def __init__(self, vards, hp): self.vards = vards; self.hp = hp
def __str__(self): return f"{self.vards} ({self.hp} HP)"
def __repr__(self): return f"Varonis({self.vards!r}, hp={self.hp})"
def __lt__(self, other): return self.hp < other.hp
def __eq__(self, other): return self.hp == other.hp
varoni = [Varonis("Anna", 100), Varonis("Jānis", 80), Varonis("Eva", 120)]
for v in sorted(varoni):
print(v)