Artikuj

Python dhe metoda të avancuara, funksione dunder për programim më të mirë

Python është një gjuhë programimi fantastike, dhe siç dëshmohet nga GitHub, është gjithashtu gjuha e dytë më e njohur në vitin 2022.

Përparësitë më interesante të Python janë komuniteti i madh i programuesve.

Duket se Python ka një paketë për çdo rast përdorimi.

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

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.

__init__

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”.

__str__ dhe __repr__

__Rr__

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!

__shtoj__

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 *).

__len__

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.

__ procesi __

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

Buletini i inovacionit
Mos humbisni lajmet më të rëndësishme mbi inovacionin. Regjistrohuni për t'i marrë ato me email.
Tags: piton

Artikujt e fundit

Tregtia elektronike në Itali në +27% sipas Raportit të ri nga Casaleggio Associati

Prezantohet raporti vjetor i Casaleggio Associati mbi tregtinë elektronike në Itali. Raporti i titulluar “AI-Commerce: kufijtë e tregtisë elektronike me inteligjencën artificiale”.…

17 Prill 2024

Ideja brilante: Bandalux prezanton Airpure®, perden që pastron ajrin

Rezultat i inovacionit të vazhdueshëm teknologjik dhe i përkushtimit ndaj mjedisit dhe mirëqenies së njerëzve. Bandalux prezanton Airpure®, një tendë…

12 Prill 2024

Modelet e Dizajnit Vs Parimet SOLID, avantazhet dhe disavantazhet

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ë…

11 Prill 2024

Magica, aplikacioni iOS që thjeshton jetën e shoferëve në menaxhimin e automjetit të tyre

Magica është aplikacioni i iPhone që e bën menaxhimin e automjeteve të thjeshtë dhe efikas, duke i ndihmuar drejtuesit të kursejnë dhe…

11 Prill 2024