A cikin sararin duniyar shirye-shiryen Python, akwai nau'ikan fasali waɗanda galibi masu farawa ba su lura da su ba, amma suna da mahimmanci ga yanayin yanayin harshe.
Hanyoyin sihiri saitin hanyoyin da aka riga aka tsaradefinites a cikin Python waɗanda ke ba da fasalulluka na musamman. Ana iya gane su cikin sauƙi ta hanyar dashes su biyu a farkon da ƙarshe, kamar __init__, __call__, __len__
… da dai sauransu.
Hanyoyin sihiri suna ba da damar abubuwa na al'ada su yi kama da ginanniyar nau'ikan Python.
A cikin wannan labarin, za mu mai da hankali kan ayyuka masu ƙarfi na dunder. Za mu bincika manufarsu kuma mu tattauna amfani da su.
Ko kai novice Python ne ko ƙwararren mai tsara shirye-shirye, wannan labarin yana nufin samar muku da cikakkiyar fahimta game da ayyukan Dunder, sa ƙwarewar coding Python ɗin ku ta fi dacewa da jin daɗi.
Ka tuna, sihirin Python ya ta'allaka ne ba kawai a cikin sauƙi da haɓaka ba, har ma a cikin fasalulluka masu ƙarfi kamar ayyukan Dunder.
Wataƙila mafi mahimmancin aikin dunder na duka. Wannan ita ce hanyar sihiri da Python ke kira kai tsaye a duk lokacin da muka ƙirƙira (ko kamar yadda sunan ya nuna, ƙaddamar) sabon abu.__init__
Pizza class:
def __init__(kai, size, toppings):
girman kai = girman
kai.toppings = toppings
# Yanzu bari mu ƙirƙiri pizza
my_pizza = Pizza ('manyan', ['pepperoni', 'namomin kaza']))
print(my_pizza.size) # Wannan zai buga: babba
print(my_pizza.toppings) # Wannan zai buga: ['pepperoni', 'namomin kaza']
A cikin wannan misali, an ƙirƙiri wani aji mai suna Pizza. Mun saita aikin mu __init__ don haɗa da sigogi don tantancewa a lokacin farawa, kuma mun saita su azaman kaddarorin kayan mu na al'ada.
Anan, ana amfani da shi don wakiltar misalin ajin. Don haka idan muka rubuta self.size = girman, muna cewa, "Hey, wannan abin pizza yana da girman sifa size
, kuma ina so ya zama kowane girman da na bayar lokacin da na halicci abin.
Wannan hanyar sihiri ce ta Python wacce ke ba mu damar definish bayanin abin mu na al'ada.
Lokacin da kake buga abu ko canza shi zuwa kirtani ta amfani da shi str()
, Python duba idan kuna da defiNa fito da wata hanya __str__
ga wannan ajin.
Idan haka ne, yi amfani da wannan hanyar don canza abu zuwa kirtani.
Za mu iya mika misalin Pizza don haɗa aiki __str__
kamar haka:
class Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): mayar f"A {self.size} pizza with {', '.join (self.toppings) )}" my_pizza = Pizza ('manyan', ['pepperoni', 'naman kaza']) buga(pizzana) # Wannan zai buga: Babban pizza tare da barkono, namomin kaza
__repr__
Aikin __str__ shine ƙarin hanyar da ba na yau da kullun ba na siffanta kaddarorin abu. A gefe guda, ana amfani da __repr__ don samar da ƙarin ƙa'ida, dalla-dalla da kwatancin abin al'ada.
Idan ka kira repr()
a kan wani abu ko kuma kawai ka rubuta sunan abu a cikin na'ura, Python zai nemi hanya __repr__
.
Se __str__
ba haka ba defiNite, Python zai yi amfani da shi __repr__
azaman madadin lokacin ƙoƙarin buga abu ko canza shi zuwa kirtani. Don haka sau da yawa yana da kyau defigama a kalla __repr__
, ko da ba ka yi ba defifitowa __str__
.
Ga yadda za mu iya defigama __repr__
ga misalin pizza na mu:
Pizza class:
def __init__(kai, size, toppings):
girman kai = girman
kai.toppings = toppings
def __repr__(kai):
koma f"Pizza('{self.size}', {self.toppings})"
my_pizza = Pizza ('manyan', ['pepperoni', 'namomin kaza']))
buga (repr(my_pizza)) # Wannan zai buga: Pizza ('manyan', ['pepperoni', 'namomin kaza']))
__repr__
yana ba ku kirtani wanda zaku iya gudu azaman umarnin Python don sake ƙirƙirar abin pizza, alhali __str__
yana ba ku ƙarin bayanin ɗan adam. Ina fatan zai taimaka muku tauna waɗannan hanyoyin dunder kaɗan kaɗan!
A cikin Python, duk mun san cewa yana yiwuwa a ƙara lambobi ta amfani da mai aiki +
, kamar 3 + 5
.
Amma idan muna son ƙara misalan wani abu na al'ada fa?
Aikin dunder __add__
yana ba mu damar yin haka kawai. Yana bamu ikon yin hakan defibatar da halin ma'aikacin +
akan abubuwan mu na musamman.
A cikin sha'awar daidaito, bari mu ɗauka muna so defigama halin +
a kan misalin pizza. Bari mu ce duk lokacin da muka haɗa pizzas biyu ko fiye tare, za ta haɗu da duk abubuwan da suka dace ta atomatik. Ga yadda zai yi kama:
Pizza class:
def __init__(kai, size, toppings):
girman kai = girman
kai.toppings = toppings
def __add__(kai, wani):
idan ba misali (wani, Pizza):
Tada TypeError ("Zaku iya ƙara wani Pizza kawai!")
new_toppings = kai.toppings + wasu.toppings
mayar Pizza(size, sabon_toppings)
# Bari mu ƙirƙiri pizzas guda biyu
pizza1 = Pizza ('manyan', ['pepperoni', 'namomin kaza']))
pizza2 = Pizza ('manyan', ['zaitun', 'abarba']))
# Kuma yanzu bari mu "ƙara" su
hade_pizza = pizza1 + pizza2
print(combined_pizza.toppings) # Wannan zai buga: ['pepperoni', 'namomin kaza', 'zaitun', 'abarba']
Daidai da dunder __add__
, za mu iya kuma defigama sauran ayyukan lissafi kamar __sub__
(ta hanyar ragi ta amfani da afareta -
) da __mul__
(don ninkawa ta amfani da afareta *
).
Wannan hanyar dunder tana ba mu damar defigama menene aikin len()
dole ne mu dawo don abubuwan da aka keɓance mu.
Python yana amfani len()
don samun tsayi ko girman tsarin bayanai kamar jeri ko kirtani.
A cikin mahallin misalinmu, zamu iya cewa "tsawon" pizza shine adadin toppings da yake da shi. Ga yadda za mu iya aiwatar da shi:
Pizza class:
def __init__(kai, size, toppings):
girman kai = girman
kai.toppings = toppings
def __len__(kai):
mayar len(self.toppings)
# Bari mu ƙirƙiri pizza
my_pizza = Pizza ('manyan', ['pepperoni', 'namomin kaza', 'zaitun']))
print(len(my_pizza)) # Wannan zai buga: 3
A cikin hanyar __len__, kawai mu dawo da tsawon jerin sunayen toppings
. Yanzu, len(my_pizza)
zai gaya mana adadin toppings a kai my_pizza
.
Wannan hanya ta dunder tana ba da damar abubuwa su zama masu motsi, watau ana iya amfani da su a cikin madauki.
Don yin wannan, dole ne mu ma defigama aikin __next__
, Ana amfani da wannan don definish halin da yakamata ya dawo da ƙima ta gaba a cikin maimaitawa. Hakanan ya kamata ya sigina mai yiwuwa akan taron cewa babu ƙarin abubuwa a cikin jerin. Yawanci muna cimma wannan ta hanyar jefa banda StopIteration
.
Ga misalin pizza ɗin mu, bari mu ce muna son maimaita abubuwan toppings. Za mu iya sanya nau'in Pizza ɗin mu mai daɗi definendo wata hanya __iter__
:
Pizza class:
def __init__(kai, size, toppings):
girman kai = girman
kai.toppings = toppings
def __iter__(kai):
kai.n = 0
dawo kai
def __na gaba__(kai):
idan kai.n < len (self.toppings):
sakamako = kai.toppings[self.n]
kai.n += 1
mayar da sakamakon
wani:
tada StopIteration
# Bari mu ƙirƙiri pizza
my_pizza = Pizza ('manyan', ['pepperoni', 'namomin kaza', 'zaitun']))
# Kuma yanzu bari mu sake maimaita shi
don yin topping a my_pizza:
buga (topping)
A wannan yanayin, don kiran madauki __iter__
, wanda ke farawa da counter (self.n)
kuma ya mayar da abin pizza kanta (self)
.
Sa'an nan, da madauki kira __next__
don samun kowane topping bi da bi.
lokacin da __next__
dawo da duk kayan yaji, StopIteration
yana jefa banda kuma don madauki yanzu ya san cewa babu sauran abubuwan toppings don haka zai zubar da tsarin haɓakawa.
Ercole Palmeri
Coveware ta Veeam zai ci gaba da ba da sabis na amsa abin da ya faru ta hanyar intanet. Coveware zai ba da damar bincikar bincike da damar gyarawa…
Kulawa da tsinkaya yana kawo sauyi a fannin mai & iskar gas, tare da sabbin hanyoyin kula da tsirrai.…
Hukumar CMA ta Burtaniya ta ba da gargadi game da halayen Big Tech a cikin kasuwar bayanan sirri. Akwai…
Dokar "Green Houses" da Tarayyar Turai ta tsara don inganta ingantaccen makamashi na gine-gine, ta kammala aikinta na majalisar tare da…