Python agus dòighean adhartach, gnìomhan dunder airson prògramadh nas fheàrr

Cùrsaichean python

Tha Python na chànan prògramaidh air leth, agus mar a chithear le GitHub, cuideachd mar an dàrna cànan as mòr-chòrdte ann an 2022.

Is e na buannachdan as inntinniche a tha aig Python a’ choimhearsnachd mhòr de luchd-prògramaidh.

Tha e coltach gu bheil pasgan aig Python airson cùis cleachdaidh sam bith.

Ann an saoghal farsaing de phrògraman Python, tha seata de fheartan ann nach toir luchd-tòiseachaidh an aire gu tric, ach aig a bheil cudrom mòr ann an eag-shiostam cànain.

Tha dòighean draoidheachd nan seata de dhòighean ro-mhìnichte ann an Python a tha a’ toirt seachad feartan syntactic sònraichte. Tha iad furasta an aithneachadh leis na loidhnichean dùbailte aca aig toiseach is deireadh, mar __init__, __call__, __len__ … etc.

Na dòighean draoidheil

Tha dòighean draoidheachd a’ leigeil le nithean àbhaisteach a bhith gan giùlan fhèin san aon dòigh ri seòrsaichean Python air a ghabhail a-steach.

San artaigil seo, cuiridh sinn fòcas air na gnìomhan dunder cumhachdach. Rannsaichidh sinn an adhbhar agus bruidhnidh sinn air an cleachdadh.

Co-dhiù a tha thu nad neach-tòiseachaidh gu Python no prògramadair eòlach, tha an artaigil seo ag amas air tuigse fharsaing a thoirt seachad air gnìomhan Dunder, a’ dèanamh an eòlas còdaidh agad Python nas èifeachdaiche agus nas tlachdmhoire.

Cuimhnich, draoidheachd na Python tha e na laighe chan ann a-mhàin ann an sìmplidheachd agus sùbailteachd, ach cuideachd anns na feartan cumhachdach aige leithid gnìomhan Dunder.

__nit__

Is dòcha gur e an gnìomh dunder as bunaitiche de na h-uile. Is e seo an dòigh draoidheachd a tha Python gairmean gu fèin-ghluasadach nuair a chruthaicheas sinn (no mar a tha an t-ainm a’ moladh, a thòisicheas sinn) nì ùr.__init__

Pizza clas:
def __init__ (fèin, meud, mullaich):
self.size = meud
self.toppings = toppings

# A-nis cruthaichidh sinn piotsa
my_pizza = Pizza ('mòr', ['pepperoni', 'balgan-buachair'])

print(my_pizza.size) # Clò-bhuailidh seo: mòr
clò-bhualadh (my_pizza.toppings) # Clò-bhuailidh seo: ['pepperoni', 'balgan-buachair']

Anns an eisimpleir seo, tha clas ris an canar Pizza air a chruthachadh. Stèidhich sinn ar gnìomh __init__ gus paramadairean a ghabhail a-steach airson a shònrachadh aig àm tòiseachaidh, agus shuidhich sinn iad mar thogalaichean airson an nì àbhaisteach againn.

An seo, thathar ga chleachdadh airson eisimpleir a’ chlas a riochdachadh. Mar sin nuair a sgrìobhas sinn self.size = meud, tha sinn ag ràdh, “Hey, tha meud buadhach aig an nì piotsa seo size, agus tha mi airson gum bi e ge bith dè am meud a thug mi seachad nuair a chruthaich mi an nì”.

__str__ agus __repr__

__Str__

Is e seo an dòigh draoidheachd Python a leigeas leinn cunntas a mhìneachadh airson an nì àbhaisteach againn.

Nuair a bhios tu a’ clò-bhualadh nì no ga thionndadh gu sreang a’ cleachdadh str(), Python Dèan cinnteach a bheil thu air modh a mhìneachadh __str__ airson clas an nì sin.

Ma tha, cleachd an dòigh sin gus an nì a thionndadh gu sreang.

Is urrainn dhuinn an eisimpleir Pizza againn a leudachadh gus gnìomh a thoirt a-steach __str__ mar a leanas:

clas Pizza: def __init__ (fèin, meud, mullaich): self.size = meud self.toppings = toppings def __str__(fèin): till f"Piotsa {self.size} le {', '.join(self.toppings) )}" my_pizza = Pizza ('mòr', ['pepperoni', 'balgan-buachair']) clò-bhualadh (my_pizza) # Clò-bhuailidh seo: Piotsa mòr le pepperoni, balgan-buachair
__repr__

Tha an gnìomh __str__ nas motha de dhòigh neo-fhoirmeil air feartan nì a mhìneachadh. Air an làimh eile, tha __repr__ air a chleachdadh gus tuairisgeul nas foirmeile, nas mionaidiche agus nas soilleire a thoirt seachad air an nì àbhaisteach.

Ma chuireas tu fòn repr() air rud no dìreach cuir a-steach ainm an nì a-steach don consol, Python bidh e a’ coimhead airson dòigh-obrach __repr__.

Se __str__ chan eil e air a mhìneachadh, Python cleachdadh __repr__ mar chùl-taic nuair a thathar a’ feuchainn ris an nì a chlò-bhualadh no a thionndadh gu sreang. Mar sin is e deagh bheachd a th’ ann gu tric mìneachadh co-dhiù __repr__, eadhon ged nach eil e air a mhìneachadh __str__.

Seo mar a b’ urrainn dhuinn a mhìneachadh __repr__ airson an eisimpleir pizza againn:

Pizza clas:
def __init__ (fèin, meud, mullaich):
self.size = meud
self.toppings = toppings

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

my_pizza = Pizza ('mòr', ['pepperoni', 'balgan-buachair'])
clò-bhualadh (repr (my_pizza)) # Clò-bhuailidh seo: Pizza ('mòr', ['pepperoni', 'balgan-buachair'])

__repr__ bheir e dhut sreang as urrainn dhut a chuir an gnìomh mar àithne Python gus am piotsa ath-chruthachadh, fhad ‘s a tha __str__ a’ toirt dhut tuairisgeul nas daonna. Tha mi an dòchas gun cuidich e thu le bhith a’ cagnadh nan dòighean dunder sin beagan nas fheàrr!

__cuir__

In Python, tha fios againn uile gun urrainn dhut àireamhan a chur ris a 'cleachdadh a' ghnìomhaiche +, coltach 3 + 5.

Ach dè ma tha sinn airson eisimpleirean de rud àbhaisteach a chuir ris?

An gnìomh dunder __add__ tha e a’ leigeil leinn dìreach sin a dhèanamh. Bheir e comas dhuinn giùlan a’ ghnìomhaiche a mhìneachadh + air na stuthan pearsanta againn.

A thaobh cunbhalachd, leig dhuinn gabhail ris gu bheil sinn airson giùlan a mhìneachadh + air an eisimpleir pizza againn. Canaidh sinn, nuair a chuireas sinn dà phiotsa no barrachd ri chèile, bidh e gu fèin-ghluasadach a’ cothlamadh na mullaich aca gu lèir. Seo cò ris a dh’ fhaodadh e a bhith coltach:

Pizza clas:
def __init__ (fèin, meud, mullaich):
self.size = meud
self.toppings = toppings

def __add__(fèin, eile):
mura h-eil an suidheachadh (eile, pizza):
tog TypeError ("Chan urrainn dhut ach piotsa eile a chur ris!")
new_toppings = self.toppings + other.toppings
tilleadh Pizza (fèin.size, new_toppings)

# Cruthaichidh sinn dà phiotsa
pizza1 = Pizza ('mòr', ['pepperoni', 'balgan-buachair'])
pizza2 = Pizza ('mòr', ['olives', 'pineapple'])

# Agus a-nis leig dhuinn "cuir" iad
combine_pizza = piotsa1 + piotsa2

clò-bhualadh (combined_pizza.toppings) # Clò-bhuailidh seo: ['pepperoni', 'balgan-buachair', 'olives', 'pineapple']

Coltach ri dunder __add__, is urrainn dhuinn cuideachd gnìomhan àireamhachd eile leithid __sub__ (le toirt air falbh a’ cleachdadh a’ ghnìomhaiche -) e __mul__ (airson iomadachadh a’ cleachdadh a’ ghnìomhaiche *).

__len__

Tha an dòigh dunder seo a’ leigeil leinn mìneachadh dè an gnìomh a th’ ann len() feumaidh sinn tilleadh airson na stuthan gnàthaichte againn.

Python Na Stàitean Aonaichte len() gus fad no meud structar dàta leithid liosta no sreang fhaighinn.

Ann an co-theacsa ar n-eisimpleir, dh'fhaodadh sinn a ràdh gur e "fad" piotsa an àireamh de thobraichean a th' aige. Seo mar a b’ urrainn dhuinn a chur an gnìomh:

Pizza clas:
def __init__ (fèin, meud, mullaich):
self.size = meud
self.toppings = toppings

def __len__(fèin):
tilleadh lionsa (self.toppings)

# Cruthaichidh sinn piotsa
my_pizza = Pizza ('mòr', ['pepperoni', 'balgan-buachair', 'ollan'])

print(len(my_pizza)) # Clò-bhuailidh seo: 3

Anns an dòigh __len__, cha till sinn ach fad an liosta toppings. A-nis, len(my_pizza) innsidh e dhuinn cia mheud bàrr a tha air my_pizza.

__ pròiseas __

Tha an dòigh dunder seo a’ leigeil le nithean a bhith air an ath-aithris, i.e. faodar a chleachdadh ann an airson lùb.

Gus seo a dhèanamh, feumaidh sinn cuideachd an gnìomh a mhìneachadh __next__, Tha seo air a chleachdadh gus an giùlan a mhìneachadh a bu chòir an ath luach san ath-aithris a thilleadh. A bharrachd air an sin, bu chòir dha cuideachd innse don ath-aithris air an tachartas nach eil barrachd eileamaidean san t-sreath. Mar as trice bidh sinn a’ coileanadh seo le bhith a’ togail eisgeachd StopIteration.

Airson an eisimpleir piotsa againn, canaidh sinn gu bheil sinn airson na mullaich ath-aithris. Dh’ fhaodadh sinn ar clas Pizza ath-aithris le bhith a’ mìneachadh dòigh-obrach __iter__:

Pizza clas:
def __init__ (fèin, meud, mullaich):
self.size = meud
self.toppings = toppings

def __iter__(fèin):
fèin.n = 0
tilleadh fèin

def __next__(fèin):
mas e fèin.n <len(self.toppings):
toradh = self.toppings[self.n]
fèin.n +=1
toradh air ais
eile:
Àrdaich StopIteration

# Cruthaichidh sinn piotsa
my_pizza = Pizza ('mòr', ['pepperoni', 'balgan-buachair', 'ollan'])

# Agus a nis rachamaid thairis air
airson bàrr ann am my_pizza:
clò-bhualadh (mullach)

Anns a 'chùis seo, airson gairmean lùb __iter__, a thòisicheas cuntair (self.n) agus tillidh e am piotsa fhèin (self).

An uairsin, an airson gairmean lùb __next__ gus gach mullach fhaighinn mu seach.

nuair a __next__ thug air ais a h-uile blasad, StopIteration tha e a’ tilgeil eisgeachd agus tha fios aig an airson loop a-nis nach eil tuilleadh mullaich ann agus mar sin sguir e den phròiseas ath-aithris.

Ercole Palmeri

Autore