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ċċ.
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.
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”.
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!
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 *
).
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
.
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
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...
Il-manutenzjoni ta’ tbassir qed tirrivoluzzjona s-settur taż-żejt u l-gass, b’approċċ innovattiv u proattiv għall-ġestjoni tal-impjant...
Is-CMA tar-Renju Unit ħarġet twissija dwar l-imġieba ta 'Big Tech fis-suq tal-intelliġenza artifiċjali. Hemm…
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...