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
Reply njofton nisjen e MLFRAME Reply, një kornizë e re gjeneruese e inteligjencës artificiale për baza heterogjene njohurish. Projektuar…
Çmimi IMSA për startup-et e rinj të lindur nga kërkimet brenda universiteteve dhe…
Çmimi Zayed për Qëndrueshmërinë është çmimi global i Emirateve të Bashkuara Arabe për qëndrueshmërinë dhe angazhimin humanitar.…
Reply, një konsulencë globale dhe integrues i sistemit dhe Ofruesi i Shërbimit i Menaxhuar i Oracle Cloud, njofton se ka marrë…
MasterZ Blockchain, rrit vlerën për Masterin më të madh të Ekselencës WEB 3.0 në Evropë. Skuadra tërësisht italiane…
33 finalistë të përzgjedhur nga 5.213 aplikime në 163 vende Finalistët avokojnë për veprim klimatik me ndikim dhe mbështesin aksesin në energji të pastër,…
Biologët janë shfaqur si një klasë farmaceutike novatore, duke revolucionarizuar fushën e mjekësisë përmes terapive të synuara. PËR…
Sigurimi i printerëve për prodhimin e metaleve dhe polimereve në fabrikat në Riom, Francë dhe Rock Hill, Karolina…
Analiza e të dhënave pa bibliotekë, e fuqizuar nga mësimi i makinerive me Spectronaut ® 18 ofron sasi dhe xhiro të proteinave lider në industri…
Mattermost përmban një ekosistem të zgjeruar të aleatëve me një theks në rastet e reja të përdorimit të DoD për zgjidhje…