Artikoli

Python u metodi avvanzati, funzjonijiet dunder għal programmazzjoni aħjar

Python huwa lingwaġġ ta 'programmar meraviljuż, u kif jidher minn GitHub, hija wkoll it-tieni l-aktar lingwa popolari fl-2022.

L-aktar vantaġġi interessanti ta 'Python huma l-komunità kbira ta' programmaturi.

Jidher li Python għandu pakkett għal kwalunkwe każ ta 'użu.

Fid-dinja vasta tal-ipprogrammar ta 'Python, hemm sett ta' karatteristiċi li ħafna drabi ma jkunux innutati minn dawk li jibdew, iżda għandhom importanza sinifikanti fl-ekosistema tal-lingwa.

Metodi magic huma sett ta 'metodi ta' qabeldefinite f'Python li jipprovdu karatteristiċi sintattiċi speċjali. Huma faċilment rikonoxxuti mid-daxxijiet doppji tagħhom fil-bidu u fit-tmiem, bħal __init__, __call__, __len__ … eċċ.

Il-Metodi Maġiċi

Metodi maġiċi jippermettu li oġġetti personalizzati jġibu ruħhom simili għal tipi Python integrati.

F'dan l-artikolu, aħna se niffukaw fuq il-funzjonijiet dunder qawwija. Se nesploraw l-iskop tagħhom u niddiskutu l-użu tagħhom.

Kemm jekk inti novizzi ta 'Python jew programmatur b'esperjenza, dan l-artikolu għandu l-għan li jagħtik fehim komprensiv tal-funzjonijiet Dunder, u jagħmel l-esperjenza tiegħek ta' kodifikazzjoni Python aktar effiċjenti u pjaċevoli.

Ftakar, il-maġija ta 'Python tinsab mhux biss fis-sempliċità u l-versatilità tagħha, iżda wkoll fil-karatteristiċi qawwija tagħha bħall-funzjonijiet Dunder.

__init__

Forsi l-aktar funzjoni dunder bażika ta 'kollha. Dan huwa l-metodu maġiku li Python awtomatikament isejjaħ kull meta noħolqu (jew kif jissuġġerixxi l-isem, inizjalizza) oġġett ġdid.__init__

klassi Pizza:
def __init__(innifsi, daqs, uċuħ):
self.size = daqs
self.toppings = toppings

# Issa ejja noħolqu pizza
my_pizza = Pizza('kbar', ['pepperoni', 'faqqiegħ'])

print(my_pizza.size) # Dan se jistampa: kbir
print(my_pizza.toppings) # Dan se jistampa: ['pepperoni', 'faqqiegħ']

F'dan l-eżempju, tinħoloq klassi msejħa Pizza. Aħna waqqafna l-funzjoni __init__ tagħna biex tinkludi l-parametri li għandhom jiġu speċifikati fil-ħin tal-inizjalizzazzjoni, u ssettjahom bħala proprjetajiet għall-oġġett tad-dwana tagħna.

Hawnhekk, huwa użat biex jirrappreżenta l-istanza tal-klassi. Allura meta niktbu self.size = size, inkunu qed ngħidu, "Ħej, dan l-oġġett tal-pizza għandu daqs ta' attribut size, u nixtieq li jkun kwalunkwe daqs li pprovdejt meta ħloqt l-oġġett”.

__str__ u __repr__

__Str__

Dan huwa l-metodu maġiku ta 'Python li jippermettilna definish deskrizzjoni għall-oġġett tad-dwana tagħna.

Meta tipprintja oġġett jew jaqilbu għal spag bl-użu str(), Python iċċekkja jekk għandekx defiStajt ħriġt b'metodu __str__ għall-klassi ta' dak l-oġġett.

Jekk iva, uża dak il-metodu biex tikkonverti l-oġġett għal spag.

Nistgħu nestendu l-eżempju tal-Pizza tagħna biex jinkludi funzjoni __str__ kif ġej:

klassi Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): return f"A {self.size} pizza bi {', '.join(self.toppings) )}" my_pizza = Pizza('grande', ['pepperoni', 'mushrooms']) print(my_pizza) # This will print: Pizza kbira bil-pepperoni, faqqiegħ
__repr__

Il-funzjoni __str__ hija aktar mod informali kif tiddeskrivi l-proprjetajiet ta 'oġġett. Min-naħa l-oħra, __repr__ jintuża biex jipprovdi deskrizzjoni aktar formali, dettaljata u mhux ambigwa tal-oġġett tad-dwana.

Jekk iċempel repr() fuq oġġett jew sempliċement ittajpja l-isem tal-oġġett fil-console, Python se tfittex metodu __repr__.

Se __str__ mhuwiex definite, Python se juża __repr__ bħala backup meta tipprova tipprintja l-oġġett jew jaqilbu għal spag. Allura ħafna drabi hija idea tajba defifinitura mill-inqas __repr__, anke jekk ma tagħmilx hekk defitoħroġ __str__.

Hawn kif nistgħu defifinitura __repr__ għall-eżempju tal-pizza tagħna:

klassi Pizza:
def __init__(innifsi, daqs, uċuħ):
self.size = daqs
self.toppings = toppings

def __repr__(self):
lura f"Pizza('{self.size}', {self.toppings})"

my_pizza = Pizza('kbar', ['pepperoni', 'faqqiegħ'])
print(repr(my_pizza)) # Dan se jistampa: Pizza('kbar', ['pepperoni', 'faqqiegħ'])

__repr__ jagħtik string li tista 'taħdem bħala kmand Python biex toħloq mill-ġdid l-oġġett tal-pizza, filwaqt li __str__ jagħtik deskrizzjoni aktar umana. Nispera li jgħinek tomgħod dawn il-metodi dunder ftit aħjar!

__żid__

F'Python, ilkoll nafu li huwa possibbli li żżid in-numri billi tuża l-operatur +, Kif 3 + 5.

Imma x'jiġri jekk irridu nżidu każijiet ta 'xi oġġett tad-dwana?

Il-funzjoni dunder __add__ jippermettilna nagħmlu dan. Jagħtina l-abbiltà li definish l-imġieba ta 'l-operatur + fuq oġġetti personalizzati tagħna.

Fl-interess tal-konsistenza, ejja nassumu li rridu defispiċċa l-imġieba ta + fuq l-eżempju tal-pizza tagħna. Ejja ngħidu li kull meta nżidu żewġ pizez jew aktar flimkien, awtomatikament jgħaqqad it-toppings kollha tagħhom. Hawn kif jista' jidher:

klassi Pizza:
def __init__(innifsi, daqs, uċuħ):
self.size = daqs
self.toppings = toppings

def __add__(self, other):
jekk mhux istanza (oħrajn, Pizza):
raise TypeError ("Tista' biss iżżid Pizza oħra!")
new_toppings = self.toppings + other.toppings
ritorn Pizza(self.size, new_toppings)

# Ejja noħolqu żewġ pizez
pizza1 = Pizza('kbir', ['pepperoni', 'faqqiegħ'])
pizza2 = Pizza('kbir', ['żebbuġ', 'ananas'])

# U issa ejja "żidhom".
combined_pizza = pizza1 + pizza2

print(combined_pizza.toppings) # Dan se jistampa: ['pepperoni', 'faqqiegħ', 'żebbuġ', 'ananas']

Simili għal dunder __add__, nistgħu wkoll defifinitura funzjonijiet aritmetiċi oħra bħal __sub__ (bit-tnaqqis bl-użu tal-operatur -u __mul__ (għall-multiplikazzjoni bl-użu tal-operatur *).

__len__

Dan il-metodu dunder jippermettilna defifinitura dak il-funzjoni len() għandu jirritorna għall-oġġetti personalizzati tagħna.

Python juża len() biex tikseb it-tul jew id-daqs ta 'struttura tad-dejta bħal lista jew string.

Fil-kuntest tal-eżempju tagħna, nistgħu ngħidu li "it-tul" ta 'pizza huwa n-numru ta' toppings li għandha. Hawn kif nistgħu nimplimentawha:

klassi Pizza:
def __init__(innifsi, daqs, uċuħ):
self.size = daqs
self.toppings = toppings

def __len__(self):
ritorn len(self.toppings)

# Ejja noħolqu pizza
my_pizza = Pizza('kbar', ['pepperoni', 'faqqiegħ', 'żebbuġ'])

print(len(my_pizza)) # Dan se jistampa: 3

Fil-metodu __len__, aħna nirritornaw biss it-tul tal-lista toppings. Issa, len(my_pizza) se tgħidilna kemm toppings hemm fuqha my_pizza.

__ proċess __

Dan il-metodu dunder jippermetti li l-oġġetti jkunu iterabbli, jiġifieri jista 'jintuża f'for loop.

Biex nagħmlu dan, irridu wkoll defispiċċa l-funzjoni __next__, Dan huwa użat għal definish l-imġieba li għandha tirritorna l-valur li jmiss fl-iterazzjoni. Għandu wkoll jindika l-iterable fil-każ li ma jkunx hemm aktar elementi fis-sekwenza. Aħna tipikament niksbu dan billi jitfgħu eċċezzjoni StopIteration.

Għall-eżempju tal-pizza tagħna, ejja ngħidu li rridu nirrepetu l-uċuħ. Nistgħu nagħmlu l-klassi tal-Pizza tagħna iterabbli definendo metodu __iter__:

klassi Pizza:
def __init__(innifsi, daqs, uċuħ):
self.size = daqs
self.toppings = toppings

def __iter__(self):
awto.n = 0
ritorn awto

def __li jmiss__(innifsi):
jekk self.n < len(self.toppings):
riżultat = self.toppings[self.n]
awto.n += 1
riżultat lura
inkella:
jgħollu StopIteration

# Ejja noħolqu pizza
my_pizza = Pizza('kbar', ['pepperoni', 'faqqiegħ', 'żebbuġ'])

# U issa ejja nirrepetu fuqha
għall-topping fil my_pizza:
print (topping)

F'dan il-każ, is-sejħiet for loop __iter__, li initializes counter (self.n) u jirritorna l-oġġett tal-pizza innifsu (self).

Imbagħad, is-sejħiet for loop __next__ biex tikseb kull topping min-naħa tiegħu.

Meta __next__ lura l-ħwawar kollha, StopIteration titfa' eċċezzjoni u l-for loop issa jaf li m'hemmx aktar toppings u għalhekk se jwaqqaf il-proċess ta 'iterazzjoni.

Ercole Palmeri

Newsletter dwar l-innovazzjoni
Titlifx l-aktar aħbarijiet importanti dwar l-innovazzjoni. Irreġistra biex tirċevihom bl-email.
Tags: python

Artikoli riċenti

Veeam għandu l-aktar appoġġ komprensiv għar-ransomware, mill-protezzjoni għar-rispons u l-irkupru

Coveware minn Veeam se jkompli jipprovdi servizzi ta' rispons għal inċidenti ta' estorsjoni ċibernetika. Coveware se joffri forensiċi u kapaċitajiet ta' rimedju...

April 23 2024

Rivoluzzjoni Ekoloġika u Diġitali: Kif il-Manutenzjoni Predittiva qed tittrasforma l-Industrija taż-Żejt u l-Gass

Il-manutenzjoni ta’ tbassir qed tirrivoluzzjona s-settur taż-żejt u l-gass, b’approċċ innovattiv u proattiv għall-ġestjoni tal-impjant...

April 22 2024

Ir-regolatur tal-antitrust tar-Renju Unit iqajjem allarm ta’ BigTech fuq GenAI

Is-CMA tar-Renju Unit ħarġet twissija dwar l-imġieba ta 'Big Tech fis-suq tal-intelliġenza artifiċjali. Hemm…

April 18 2024

Casa Green: rivoluzzjoni tal-enerġija għal futur sostenibbli fl-Italja

Id-Digriet "Case Green", ifformulat mill-Unjoni Ewropea biex itejjeb l-effiċjenza enerġetika tal-bini, ikkonkluda l-proċess leġiżlattiv tiegħu bi...

April 18 2024