Izihloko

I-Python nezindlela ezithuthukisiwe, imisebenzi ye-dunder yokuhlela okungcono

I-Python iwulimi oluhle kakhulu lokuhlela, futhi njengoba kufakazelwa GitHub, futhi ulimi lwesibili oludume kakhulu ngo-2022.

Izinzuzo ezithakazelisa kakhulu zePython umphakathi omkhulu wabahleli bohlelo.

Kubonakala sengathi i-Python inephakheji yanoma yiliphi icala lokusetshenziswa.

Emhlabeni omkhulu wohlelo lwePython, kunesethi yezici ezivame ukunganakwa abasaqalayo, nokho ezinokubaluleka okubalulekile ku-ecosystem yolimi.

Izindlela zomlingo ziyisethi yezindlela zangaphambilidefiama-nites ku-Python ahlinzeka ngezici ezikhethekile ze-syntactic. Abonakala kalula ngamadeshi awo aphindwe kabili ekuqaleni nasekupheleni, njengokuthi __init__, __call__, __len__ … njll.

Izindlela Zomlingo

Izindlela zomlingo zivumela izinto zangokwezifiso ukuthi ziziphathe ngokufana nezinhlobo zePython ezakhelwe ngaphakathi.

Kulesi sihloko, sizogxila emisebenzini enamandla ye-dunder. Sizohlola inhloso yabo futhi sixoxe ngokusetshenziswa kwazo.

Noma ngabe ungumfundi we-Python noma umhleli onolwazi, le ndatshana ihlose ukukunikeza ukuqonda okuphelele kwemisebenzi ye-Dunder, okwenza ulwazi lwakho lwekhodi ye-Python lusebenze kahle futhi lujabulise.

Khumbula, umlingo wePython awukho nje kuphela ekululameni nasekusebenziseni izinto ezihlukahlukene, kodwa nasezicini zayo ezinamandla ezifana nemisebenzi ye-Dunder.

__init__

Mhlawumbe umsebenzi we-dunder oyisisekelo kunayo yonke. Lena indlela yomlingo iPython eyishayela ngokuzenzakalelayo noma nini lapho sidala (noma njengoba igama liphakamisa, qalisa) into entsha.__init__

I-pizza yeklasi:
def __init__(self, size, toppings):
self.size = usayizi
self.toppings = izigqoko

# Manje ake sakhe i-pizza
my_pizza = I-pizza('enkulu', ['pepperoni', 'amakhowe'])

phrinta(my_pizza.size) # Lokhu kuzophrinta: kukhulu
phrinta(my_pizza.toppings) # Lokhu kuzophrinta: ['pepperoni', 'amakhowe']

Kulesi sibonelo, kudalwa ikilasi elibizwa ngePizza. Setha umsebenzi wethu we-__init__ ukuze ufake imingcele ezocaciswa ngesikhathi sokuqalisa, futhi siwamise njengezakhiwo zento yethu yangokwezifiso.

Lapha, isetshenziselwa ukumela isibonelo sekilasi. Ngakho-ke uma sibhala i-self.size = usayizi, sithi, "Heyi, le nto ye-pizza inosayizi wesibaluli. size, futhi ngifuna kube yinoma yimuphi usayizi engiwunikezile lapho ngidala into”.

__str__ kanye ne-__repr__

__Str__

Lena indlela yomlingo yePython esivumela ukuthi senze defingicela incazelo yento yethu yangokwezifiso.

Uma uphrinta into noma uyiguqulela kuyunithi yezinhlamvu usebenzisa str(), i-Python hlola ukuthi unayo defiNgiqhamuke nendlela __str__ okwesigaba saleyo nto.

Uma kunjalo, sebenzisa leyo ndlela ukuze uguqule into ibe iyunithi yezinhlamvu.

Singanweba isibonelo sethu sePizza ukuze sifake umsebenzi __str__ kanje:

class Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): return f"I-pizza engu-{self.size} ene-{', '.join(self.toppings) )}" my_pizza = I-Pizza('enkulu', ['pepperoni', 'amakhowe']) phrinta(my_pizza) # Lokhu kuzophrintwa: I-pizza enkulu ene-pepperoni, amakhowe
__repr__

Umsebenzi __str__ uyindlela engakahleleki yokuchaza izici zento. Ngakolunye uhlangothi, i-__repr__ isetshenziselwa ukunikeza incazelo ehlelekile, enemininingwane futhi engacacile yento yangokwezifiso.

Uma ufona repr() entweni noma uthayipha nje igama lento kukhonsoli, iPython izobheka indlela __repr__.

Se __str__ akuyona definite, iPython izosebenzisa __repr__ njengesipele lapho uzama ukuphrinta into noma ukuyiguqulela kuyunithi yezinhlamvu. Ngakho ngokuvamile kuwumqondo omuhle defiqeda okungenani __repr__, ngisho noma ungakwenzi defikuhle __str__.

Nakhu ukuthi singakwenza kanjani defiqeda __repr__ isibonelo sethu se-pizza:

I-pizza yeklasi:
def __init__(self, size, toppings):
self.size = usayizi
self.toppings = izigqoko

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

my_pizza = I-pizza('enkulu', ['pepperoni', 'amakhowe'])
phrinta(repr(my_pizza)) # Lokhu kuzophrintwa: I-Pizza('enkulu', ['pepperoni', 'amakhowe'])

__repr__ ikunikeza intambo ongayigijima njengomyalo wePython wokwenza kabusha into ye-pizza, kanti __str__ ikunikeza incazelo yomuntu eyengeziwe. Ngethemba ukuthi kuzokusiza ukuthi uhlafune lezi zindlela ze-dunder kangcono!

__engeza__

E-Python, sonke siyazi ukuthi kungenzeka ukwengeza izinombolo usebenzisa opharetha +, woza 3 + 5.

Kodwa kuthiwani uma sifuna ukwengeza izimo zento ethile yangokwezifiso?

Umsebenzi we-dunder __add__ kusivumela ukuba senze lokho kanye. Kusinika amandla okwenza defisusa ukuziphatha komsebenzisi + ezintweni zethu eziqondene nawe.

Ngokwentshisekelo yokuvumelana, ake sicabange ukuthi siyafuna defiqeda ukuziphatha kwe + esibonelweni sethu se-pizza. Ake sithi noma nini lapho sihlanganisa ama-pizza amabili noma ngaphezulu ndawonye, ​​azohlanganisa ngokuzenzakalelayo konke okugcotshwa kwawo. Nansi indlela engase ibukeke ngayo:

I-pizza yeklasi:
def __init__(self, size, toppings):
self.size = usayizi
self.toppings = izigqoko

def __add__(self, other):
uma kungenjalo (okunye, i-Pizza):
phakamisa i-TypeError("Ungangeza kuphela enye i-Pizza!")
new_toppings = self.toppings + other.toppings
buyisela i-Pizza(self.size, new_toppings)

# Ake sakhe ama-pizza amabili
pizza1 = I-pizza('enkulu', ['pepperoni', 'amakhowe'])
pizza2 = I-pizza('enkulu', ['iminqumo', 'uphayinaphu'])

# Manje "masengeze" kubo
i-combined_pizza = i-pizza1 + i-pizza2

phrinta(combined_pizza.toppings) # Lokhu kuzophrinta: ['pepperoni', 'amakhowe', 'iminqumo', 'uphayinaphu']

Ngokufanayo ne-dunder __add__, singakwazi futhi defiqedela eminye imisebenzi ye-arithmetic efana __sub__ (ngokususa usebenzisa opharetha -) kanye __mul__ (ukuphindaphinda usebenzisa opharetha *).

__len__

Le ndlela ye-dunder isivumela ukuthi defiqeda lokho umsebenzi len() kufanele sibuyele ezintweni zethu ezenziwe ngokwezifiso.

Python isebenzisa len() ukuze uthole ubude noma usayizi wesakhiwo sedatha njengohlu noma iyunithi yezinhlamvu.

Kumongo wesibonelo sethu, singasho ukuthi "ubude" be-pizza yinombolo yezinto ezigcotshwayo enazo. Nansi indlela esingakusebenzisa ngayo:

I-pizza yeklasi:
def __init__(self, size, toppings):
self.size = usayizi
self.toppings = izigqoko

def __len__(self):
buyisela i-len(self.toppings)

# Ake sakhe i-pizza
my_pizza = I-pizza('enkulu', ['pepperoni', 'amakhowe', 'iminqumo'])

phrinta(len(my_pizza)) # Lokhu kuzophrinta: 3

Ngendlela __len__, sibuyisela ubude bohlu kuphela toppings. Manje, len(my_pizza) izositshela ukuthi mangaki ama-toppings kuwo my_pizza.

_____ inqubo _____

Le ndlela ye-dunder ivumela izinto ukuthi zikwazi ukuphindaphindeka, okungukuthi ingasetshenziswa ku-loop.

Ukuze senze lokhu, kufanele futhi defiqeda umsebenzi __next__, Lokhu kusetshenziselwa defiqeda ukuziphatha okufanele kubuyise inani elilandelayo ekuphindaphindweni. Kufanele futhi ibonise i-iterable kumcimbi wokuthi azisekho izici ngokulandelana. Ngokuvamile sizuza lokhu ngokwenza okuhlukile StopIteration.

Ngesibonelo sethu se-pizza, ake sithi sifuna ukuphinda ama-toppings. Singenza ikilasi lethu lePizza lijabule definendo indlela __iter__:

I-pizza yeklasi:
def __init__(self, size, toppings):
self.size = usayizi
self.toppings = izigqoko

def __iter__(self):
wena = 0
buyela wena

def __next__(self):
if self.n < len(self.toppings):
umphumela = self.toppings[self.n]
self.n += 1
umphumela wokubuyisela
okunye:
phakamisa i-StopIteration

# Ake sakhe i-pizza
my_pizza = I-pizza('enkulu', ['pepperoni', 'amakhowe', 'iminqumo'])

# Manje ake siphindaphinde ngakho
ukuze ugcwalise ku-pizza yami:
phrinta (topping)

Kulokhu, izingcingo ze-loop __iter__, eqalisa isibali (self.n) futhi ibuyisela into ye-pizza ngokwayo (self).

Bese, izingcingo ze-loop __next__ ukuthola i-topping ngayinye ngokulandelana.

UQando __next__ wabuyisela zonke izinongo, StopIteration yenza okuhlukile futhi i-loop manje iyazi ukuthi akusekho okungaphezulu futhi izokhipha inqubo yokuphindaphinda.

Ercole Palmeri

Innovation newsletter
Ungaphuthelwa yizindaba ezibaluleke kakhulu zokuqamba. Bhalisa ukuze uthole nge-imeyili.
Omaka: i-python

Izihloko zakamuva

I-Veeam ifaka ukusekelwa okuphelele kakhulu kwe-ransomware, kusukela ekuvikelweni kuya ekuphenduleni nasekululameni

I-Coveware ye-Veeam izoqhubeka nokuhlinzeka ngezinsizakalo zokuphendula izigameko zokuntshontshwa kwe-inthanethi. I-Coveware izohlinzeka ngama-forensics kanye nekhono lokulungisa…

23 April 2024

Inguquko Eluhlaza Nedijithali: Indlela Ukugcinwa Okubikezelwayo Kuyiguqula Kanjani Imboni Kawoyela Negesi

Ukulungiswa okuqagelayo kuguqula umkhakha kawoyela negesi, ngendlela emisha nesebenzayo yokuphatha izitshalo.…

22 April 2024

Isilawuli se-antitrust sase-UK siphakamisa i-alamu ye-BigTech nge-GenAI

I-CMA yase-UK ikhiphe isexwayiso mayelana nokuziphatha kwe-Big Tech emakethe yezobunhloli bokwenziwa. Lapho…

18 April 2024

I-Casa Green: inguquko yamandla yekusasa elisimeme e-Italy

Isinqumo esithi "Case Green", esakhiwe yi-European Union ukuze kuthuthukiswe ukusebenza kahle kwamandla ezakhiwo, siphothule inqubo yaso yomthetho ngokuthi...

18 April 2024