Në botën e madhe të programimit Python, ekziston një sërë veçorish që shpesh kalojnë pa u vënë re nga fillestarët, por megjithatë kanë një rëndësi të madhe në ekosistemin e gjuhës.
Metodat magjike janë një grup metodash paraprakedefinites në Python që ofrojnë veçori të veçanta sintaksore. Ata njihen lehtësisht nga vizat e tyre të dyfishta në fillim dhe në fund, si p.sh __init__, __call__, __len__
… etj.
Metodat magjike lejojnë që objektet e personalizuara të sillen ngjashëm me llojet e integruara të Python.
Në këtë artikull, ne do të përqendrohemi në funksionet e fuqishme dunder. Ne do të shqyrtojmë qëllimin e tyre dhe do të diskutojmë përdorimin e tyre.
Pavarësisht nëse jeni një fillestar në Python ose një programues me përvojë, ky artikull synon t'ju ofrojë një kuptim gjithëpërfshirës të funksioneve të Dunder, duke e bërë përvojën tuaj të kodimit në Python më efikase dhe më të këndshme.
Mos harroni, magjia e Python nuk qëndron vetëm në thjeshtësinë dhe shkathtësinë e tij, por edhe në veçoritë e tij të fuqishme si funksionet Dunder.
Ndoshta funksioni më themelor i të gjithëve. Kjo është metoda magjike që Python thërret automatikisht sa herë që krijojmë (ose siç sugjeron emri, inicializojmë) një objekt të ri.__init__
Pica e klasës:
def __init__(vetë, madhësia, mbushjet):
vetë.madhësia = madhësia
vetë.mbije = mbushje
# Tani le të krijojmë një picë
my_pizza = Pica('e madhe', ['pepperoni', 'kërpudha'])
print(my_pizza.size) # Kjo do të printojë: i madh
print(my_pizza.toppings) # Kjo do të printojë: ['pepperoni', 'kërpudha']
Në këtë shembull, krijohet një klasë e quajtur Pizza. Ne konfiguruam funksionin tonë __init__ për të përfshirë parametrat që do të specifikohen në kohën e inicializimit dhe i vendosim ato si veti për objektin tonë të personalizuar.
Këtu, përdoret për të përfaqësuar shembullin e klasës. Pra, kur shkruajmë self.size = madhësia, ne po themi, "Hej, ky objekt picash ka një madhësi atribute size
, dhe dua që të jetë çfarëdo madhësie që kam dhënë kur kam krijuar objektin”.
Kjo është metoda magjike e Python që na lejon definish një përshkrim për artikullin tonë të personalizuar.
Kur printoni një objekt ose e konvertoni atë në një varg duke përdorur str()
, Python kontrolloni nëse keni defiUnë kam dalë me një metodë __str__
për klasën e atij objekti.
Nëse po, përdorni atë metodë për të kthyer objektin në një varg.
Ne mund ta zgjerojmë shembullin tonë të Pizza për të përfshirë një funksion __str__
si më poshtë:
class Pizza: def __init__(vetë, madhësia, toppings): vetë.size = size self.toppings = toppings def __str__(vetë): kthe f"A {self.size} pizza with {', '.join(self.toppings )}" my_pizza = Pica('large', ['pepperoni', 'kërpudha']) print(my_pizza) # Kjo do të printojë: Një picë e madhe me peperoni, kërpudha
__repr__
Funksioni __str__ është më shumë një mënyrë joformale për të përshkruar vetitë e një objekti. Nga ana tjetër, __repr__ përdoret për të ofruar një përshkrim më formal, të detajuar dhe më të qartë të objektit të personalizuar.
Nëse telefononi repr()
në një objekt ose thjesht shkruani emrin e objektit në tastierë, Python do të kërkojë një metodë __repr__
.
Se __str__
asnje definite, Python do të përdorë __repr__
si një kopje rezervë kur përpiqeni të printoni objektin ose ta shndërroni atë në një varg. Kështu që shpesh është një ide e mirë defipërfundoni të paktën __repr__
, edhe nëse nuk e bëni defivjen nga __str__
.
Ja si mundemi defipërfundoni __repr__
për shembullin tonë të picës:
Pica e klasës:
def __init__(vetë, madhësia, mbushjet):
vetë.madhësia = madhësia
vetë.mbije = mbushje
def __repr__(vetë):
ktheni f"Pica('{self.size}', {self.toppings})"
my_pizza = Pica('e madhe', ['pepperoni', 'kërpudha'])
print(repr(my_pizza)) # Kjo do të printojë: Pica ('i madh', ['pepperoni', 'kërpudha'])
__repr__
ju jep një varg që mund ta ekzekutoni si një komandë Python për të rikrijuar objektin e picës, ndërsa __str__
ju jep një përshkrim më njerëzor. Shpresoj që t'ju ndihmojë t'i përtypni pak më mirë këto metoda!
Në Python, ne të gjithë e dimë se është e mundur të shtoni numra duke përdorur operatorin +
, Si 3 + 5
.
Por, çka nëse duam të shtojmë shembuj të ndonjë objekti të personalizuar?
Funksioni dunder __add__
na lejon të bëjmë pikërisht këtë. Na jep aftësinë për të defikujdes sjelljen e operatorit +
në artikujt tanë të personalizuar.
Në interes të konsistencës, le të supozojmë se duam defipërfundoni sjelljen e +
në shembullin tonë të picës. Le të themi se sa herë që shtojmë dy ose më shumë pica së bashku, automatikisht do të kombinohen të gjitha mbushjet e tyre. Ja si mund të duket:
Pica e klasës:
def __init__(vetë, madhësia, mbushjet):
vetë.madhësia = madhësia
vetë.mbije = mbushje
def __shto__(vetja, tjetri):
nëse jo një shembull (tjetër, Pica):
raise TypeError ("Mund të shtoni vetëm një pica tjetër!")
ri_toppings = vetë.mbushje + të tjera.toppings
Pica kthyese (përmasat e veta, mbushjet e reja)
# Le të krijojmë dy pica
pizza1 = Pica ('e madhe', ['pepperoni', 'kërpudha'])
pizza2 = Pica ('i madh', ['ullinj', 'ananas'])
# Dhe tani le t'i "shtojmë" ato
pica_kombinuar = pica1 + pica2
print(combined_pizza.toppings) # Kjo do të printojë: ['pepperoni', 'kërpudha', 'ullinj', 'ananas']
Ngjashëm me dunder __add__
, ne gjithashtu mundemi defitë përfundojë funksione të tjera aritmetike si p.sh __sub__
(me zbritje duke përdorur operatorin -
) Dhe __mul__
(për shumëzim duke përdorur operatorin *
).
Kjo metodë dunder na lejon defipërfundojnë atë funksion len()
duhet të kthehen për artikujt tanë të personalizuar.
Python përdor len()
për të marrë gjatësinë ose madhësinë e një strukture të dhënash si një listë ose varg.
Në kontekstin e shembullit tonë, mund të themi se "gjatësia" e një pice është numri i mbushjeve që ka. Ja se si mund ta zbatojmë atë:
Pica e klasës:
def __init__(vetë, madhësia, mbushjet):
vetë.madhësia = madhësia
vetë.mbije = mbushje
def __len__(vetë):
lente kthyese (vetë. mbushje)
# Le të krijojmë një picë
my_pizza = Pica('e madhe', ['pepperoni', 'kërpudha', 'ullinj'])
print(len(pica_my)) # Kjo do të printojë: 3
Në metodën __len__, ne kthejmë vetëm gjatësinë e listës toppings
. Tani, len(my_pizza)
do të na tregojë sa mbushje ka mbi të my_pizza
.
Kjo metodë dunder lejon që objektet të jenë të përsëritur, d.m.th. mund të përdoret në një cikli for.
Për ta bërë këtë, ne gjithashtu duhet defipërfundoni funksionin __next__
, Kjo përdoret për definish sjelljen që duhet të kthejë vlerën tjetër në përsëritje. Ai gjithashtu duhet të sinjalizojë përsëritësin në rast se nuk ka më elementë në sekuencë. Zakonisht e arrijmë këtë duke bërë një përjashtim StopIteration
.
Për shembullin tonë të picës, le të themi se duam të përsërisim mbushjet. Ne mund ta bëjmë klasën tonë të Pizzës të përsëritur definendo një metodë __iter__
:
Pica e klasës:
def __init__(vetë, madhësia, mbushjet):
vetë.madhësia = madhësia
vetë.mbije = mbushje
defin __iter__(vetë):
vetë.n = 0
kthej veten
defin __next__(vetë):
nqs vet.n < len(vete.mbushje):
rezultat = vetë.mbushje[vetë.n]
vetja.n += 1
rezultati i kthimit
tjeter:
ngriti StopIteration
# Le të krijojmë një picë
my_pizza = Pica('e madhe', ['pepperoni', 'kërpudha', 'ullinj'])
# Dhe tani le të përsërisim mbi të
për mbushje në my_pizza:
shtypje (përfundim)
Në këtë rast, cikli for thërret __iter__
, i cili inicializon një numërues (self.n)
dhe e kthen vetë objektin e picës (self)
.
Pastaj, cikli for bën thirrje __next__
për të marrë çdo majë me radhë.
Quando __next__
ktheu të gjitha erëzat, StopIteration
hedh një përjashtim dhe cikli for tani e di që nuk ka më mbushje dhe kështu do të ndërpresë procesin e përsëritjes.
Ercole Palmeri
Prezantohet raporti vjetor i Casaleggio Associati mbi tregtinë elektronike në Itali. Raporti i titulluar “AI-Commerce: kufijtë e tregtisë elektronike me inteligjencën artificiale”.…
Rezultat i inovacionit të vazhdueshëm teknologjik dhe i përkushtimit ndaj mjedisit dhe mirëqenies së njerëzve. Bandalux prezanton Airpure®, një tendë…
Modelet e projektimit janë zgjidhje specifike të nivelit të ulët për problemet e përsëritura në dizajnimin e softuerit. Modelet e dizajnit janë…
Magica është aplikacioni i iPhone që e bën menaxhimin e automjeteve të thjeshtë dhe efikas, duke i ndihmuar drejtuesit të kursejnë dhe…