Kwihlabathi elikhulu lenkqubo yePython, kukho iseti yeempawu ezihlala zingaqatshelwa ngabasaqalayo, kodwa zibaluleke kakhulu kwi-ecosystem yolwimi.
Iindlela zomlingo yiseti yeendlela zangaphambilidefinited kwiPython ebonelela ngokusebenza okukhethekileyo kokwenziwa kwentetho. Zibonwa lula ngoodwi bawo kabini ekuqaleni nasekupheleni, njenge __init__, __call__, __len__
... njl.
Iindlela zomlingo zivumela izinto zesiko ukuba ziziphathe ngokufana neentlobo zePython ezakhelwe ngaphakathi.
Kweli nqaku, siza kugxila kwimisebenzi enamandla ye-dunder. Siza kuphonononga injongo yabo kwaye sixoxe ngokusetyenziswa kwabo.
Nokuba ungumfundi wePython okanye ungumdwebi wenkqubo onamava, eli nqaku lijolise ekukuboneleleni ngokuqonda okubanzi kwemisebenzi yeDunder, okwenza amava akho ekhowudi yePython asebenze ngakumbi kwaye ayonwabe.
Khumbula, umlingo wePython abukho nje ngokulula kunye nokuguquguquka kwayo, kodwa nakwiempawu zayo ezinamandla njengemisebenzi yeDunder.
Mhlawumbi owona msebenzi usisiseko we-dunder kuwo wonke. Le yindlela yomlingo iPython eyibiza ngokuzenzekelayo ngalo lonke ixesha sidala (okanye njengoko igama licebisa, qalisa) into entsha.__init__
iklasi yePizza:
def __init__(uqobo, ubungakanani, iitoppings):
self.size = ubukhulu
self.toppings = iitoppings
# Ngoku makhe senze ipizza
my_pizza = iPizza('enkulu', ['pepperoni', 'amakhowa'])
print(my_pizza.size) # Oku kuya kuprinta: enkulu
print(my_pizza.toppings) # Oku kuya kuprinta: ['pepperoni', 'amakhowa']
Kulo mzekelo, iklasi ebizwa ngokuba yiPizza yenziwe. Siseta __init__ umsebenzi wethu ukubandakanya iiparameters ukucacisa ngexesha lokuqalisa, kwaye sizise njengempahla yento yethu yesiko.
Apha, isetyenziselwa ukumela umzekelo weklasi. Ke xa sibhala self.size = ubukhulu, sithi, "Heyi, le pizza inophawu size
, kwaye ndifuna ukuba yiyiphi na isayizi endiyinike yona xa ndidala into ".
Le yindlela yomlingo yePython esivumela ukuba senze defiNite inkcazo yento yethu yesiko.
Xa uprinta into okanye uyiguqulela kumtya usebenzisa str()
, Python khangela ukuba unayo defindenze indlela __str__
kudidi lwaloo nto.
Ukuba kunjalo, sebenzisa loo ndlela ukuguqula into ibe ngumtya.
Sinokwandisa umzekelo wethu wePizza ukubandakanya umsebenzi __str__
ngolu hlobo:
iklasi Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): return f"A {self.size} pizza nge {', '.join(self.toppings) )}" my_pizza = IPizza('inkulu', ['pepperoni', 'amakhowa']) print(my_pizza) # Oku kuya kuprintwa: Ipizza enkulu enepepperoni, amakhowa
__repr__
Umsebenzi we-__str__ ungaphezulu kwendlela engekho sikweni yokuchaza iimpawu zento. Kwelinye icala, __repr__ isetyenziselwa ukubonelela ngokusesikweni ngakumbi, inkcazo eneenkcukacha kunye necacileyo yento yesiko.
Ukuba uyafowuna repr()
kwinto okanye uchwetheza nje igama lento kwiconsole, iPython izakukhangela indlela __repr__
.
Se __str__
yiyo ayiyo definite, iPython iya kusebenzisa __repr__
njengogcino xa uzama ukuprinta into okanye ukuyiguqulela kumtya. Ngoko idla ngokuba ngumbono olungileyo defiukugqiba ubuncinane __repr__
, nokuba awufuni defikuhle __str__
.
Nantsi indlela esinokuyenza ngayo defigqiba __repr__
kumzekelo wethu wepizza:
iklasi yePizza:
def __init__(uqobo, ubungakanani, iitoppings):
self.size = ubukhulu
self.toppings = iitoppings
def __repr__(self):
return f"Pizza('{self.size}', {self.toppings})"
my_pizza = iPizza('enkulu', ['pepperoni', 'amakhowa'])
print(repr(my_pizza)) # Oku kuya kuprinta: I-Pizza('enkulu', ['pepperoni', 'amakhowa'])
__repr__
ikunika umtya onokuthi uwubaleke njengomyalelo wePython ukwenza kwakhona into yepizza, kanti __str__
ikunika inkcazo yomntu ngakumbi. Ndiyathemba ukuba iyakunceda ukuba uhlafune ezi ndlela ze-dunder ngcono kancinci!
KwiPython, sonke siyazi ukuba kunokwenzeka ukongeza amanani usebenzisa umqhubi +
, njenge 3 + 5
.
Kodwa kuthekani ukuba sifuna ukongeza imizekelo yento eqhelekileyo?
Umsebenzi we-dunder __add__
isivumela ukuba senze loo nto kanye. Isinika ithuba lokuba deficokisa ukuziphatha komsebenzisi +
kwizinto zethu ezenzelwe wena.
Ngomdla wokungaguquguquki, masicinge ukuba sifuna definite ukuziphatha kwe +
kumzekelo wethu wepizza. Masithi nanini na xa songeza iipizza ezimbini okanye ngaphezulu kunye, iyakudibanisa ngokuzenzekelayo zonke iitoppings zazo. Nantsi into enokujongeka ngayo:
iklasi yePizza:
def __init__(uqobo, ubungakanani, iitoppings):
self.size = ubukhulu
self.toppings = iitoppings
def __yongeza__(ukwakho, okunye):
ukuba akunjalo (enye, iPizza):
phakamisa i-TypeError ("Unokongeza enye iPizza!")
new_toppings = self.toppings + other.toppings
buyisela iPizza(ubukhulu, iziqholo ezintsha)
# Masenze iipizza ezimbini
pizza1 = Ipitsa('enkulu', ['pepperoni', 'amakhowa'])
ipizza2 = IPizza('enkulu', ['iminquma', 'pineapple'])
# Kwaye ngoku "mabongeze" kubo
idityanisiwe_pizza = ipizza1 + ipizza2
print(combined_pizza.toppings) # Oku kuya kuprinta: ['pepperoni', 'amakhowa', 'iminquma', 'ipayina']
Ngokufanayo ne-dunder __add__
, nathi sinako definite eminye imisebenzi arithmetic ezifana __sub__
(ngokuthabatha usebenzisa umsebenzisi -
) e __mul__
(ukuphindaphinda usebenzisa umsebenzisi *
).
Le ndlela ye-dunder iyasivumela ukuba definish yintoni umsebenzi len()
kufuneka sibuyele kwizinto zethu ezenziwe ngokwezifiso.
Python isebenzisa len()
ukufumana ubude okanye ubungakanani besakhiwo sedata esinjengoluhlu okanye umtya.
Kumxholo womzekelo wethu, sinokuthi "ubude" bepizza linani lezinto zokuthambisa enazo. Nantsi indlela esinokuyiphumeza ngayo:
iklasi yePizza:
def __init__(uqobo, ubungakanani, iitoppings):
self.size = ubukhulu
self.toppings = iitoppings
def __len__(self):
buyisela len(self.toppings)
# Masenze ipizza
my_pizza = iPizza('enkulu', ['pepperoni', 'amakhowa', 'iminquma'])
print(len(my_pizza)) # Oku kuya kuprinta: 3
Kwindlela ye-__len__, sibuyisela kuphela ubude boluhlu toppings
. Ngoku, len(my_pizza)
iya kusixelela ukuba zingaphi iitoppings eziphezu kwayo my_pizza
.
Le ndlela ye-dunder ivumela izinto ukuba zikwazi ukuphinda-phinda, o.k.t. ingasetyenziswa kwi-loop.
Ukwenza oku, kufuneka nathi defigqibezela umsebenzi __next__
, Oku kusetyenziselwa defiPhelisa ukuziphatha ekufuneka kubuyise ixabiso elilandelayo kuphindaphindo. Ngaphaya koko, kufuneka kwakhona ibonise i-iterable kwisiganeko sokuba akusekho zinto kulandelelwano. Ngokuqhelekileyo sifezekisa oku ngokuphakamisa okukhethekileyo StopIteration
.
Kumzekelo wethu wepizza, masithi sifuna ukuphinda-phinda iitoppings. Sinokwenza iklasi yethu yePizza ibe lula defiukunika indlela __iter__
:
iklasi yePizza:
def __init__(uqobo, ubungakanani, iitoppings):
self.size = ubukhulu
self.toppings = iitoppings
def __iter__(self):
wena = 0
zibuyise
def __ilandelayo__(self):
ukuba self.n < len(self.toppings):
isiphumo = self.toppings[self.n]
wena.n += 1
isiphumo sokubuya
enye:
phakamisa StopIteration
# Masenze ipizza
my_pizza = iPizza('enkulu', ['pepperoni', 'amakhowa', 'iminquma'])
# Kwaye ngoku makhe siyiphindaphinde
yokongeza kwi-pizza yam:
print(ukubeka phezulu)
Kule meko, i-loop iminxeba __iter__
, eqalisa ikhawuntara (self.n)
kwaye ibuyisela into ye pizza ngokwayo (self)
.
Emva koko, i-loop iminxeba __next__
ukufumana itopping nganye ngokulandelelana.
UQuando __next__
wabuyisela zonke iziqholo, StopIteration
iphosa okwahlukileyo kwaye i-loop ngoku iyazi ukuba akusekho kwanto yokuphinda iphinde iphinde iphinde iphinde iqale.
Ercole Palmeri
Ukuphuhlisa izakhono zemoto ngokufaka imibala kulungiselela abantwana izakhono ezinzima ezifana nokubhala. Ukufaka umbala...
Icandelo lomkhosi wasemanzini ligunya lokwenyani loqoqosho lwehlabathi, elithe lajonga kwimarike ye-150 yeebhiliyoni...
NgoMvulo ophelileyo, i-Financial Times ibhengeze isivumelwano kunye ne-OpenAI. I-FT ikhupha iilayisensi kubuntatheli bayo obukumgangatho wehlabathi…
Izigidi zabantu zihlawula iinkonzo zokusasaza, zihlawula umrhumo wenyanga. Luluvo oluqhelekileyo ukuba…