Artikels

Python en gevorderde metodes, dunder-funksies vir beter programmering

Python is 'n fantastiese programmeertaal, en soos bewys deur GitHub, is ook die tweede gewildste taal in 2022.

Die interessantste voordele van Python is die groot gemeenskap van programmeerders.

Dit blyk dat Python 'n pakket het vir enige gebruiksgeval.

In die uitgestrekte wêreld van Python-programmering is daar 'n stel kenmerke wat dikwels deur beginners ongemerk bly, maar tog beduidende belang in die ekosisteem van die taal het.

Magiese metodes is 'n stel vooraf metodesdefinites in Python wat spesiale sintaktiese kenmerke bied. Hulle word maklik herken aan hul dubbele strepies aan die begin en einde, soos __init__, __call__, __len__ … ens.

Die magiese metodes

Magiese metodes laat pasgemaakte voorwerpe toe om soortgelyk aan ingeboude Python-tipes op te tree.

In hierdie artikel sal ons fokus op die kragtige dunder-funksies. Ons sal die doel daarvan ondersoek en die gebruik daarvan bespreek.

Of jy nou 'n Python-beginner of 'n ervare programmeerder is, hierdie artikel poog om jou 'n omvattende begrip van Dunder-funksies te gee, wat jou Python-kodering-ervaring doeltreffender en aangenamer maak.

Onthou, die magie van Python lê nie net in sy eenvoud en veelsydigheid nie, maar ook in sy kragtige kenmerke soos Dunder-funksies.

__init__

Miskien die mees basiese dunder-funksie van almal. Dit is die towermetode wat Python outomaties aanroep wanneer ons 'n nuwe voorwerp skep (of soos die naam aandui, inisialiseer).__init__

klas pizza:
def __init__(self, grootte, toppings):
self.size = grootte
self.toppings = toppings

# Kom ons skep nou 'n pizza
my_pizza = Pizza('groot', ['pepperoni', 'sampioene'])

print(my_pizza.size) # Dit sal druk: groot
print(my_pizza.toppings) # Dit sal druk: ['pepperoni', 'sampioene']

In hierdie voorbeeld word 'n klas genaamd Pizza geskep. Ons stel ons __init__-funksie op om die parameters in te sluit wat tydens die inisialiseringstyd gespesifiseer moet word, en stel dit as eienskappe vir ons pasgemaakte voorwerp.

Hier word dit gebruik om die instansie van die klas voor te stel. So wanneer ons self.size = size skryf, sê ons: "Haai, hierdie pizza-voorwerp het 'n kenmerkgrootte size, en ek wil hê dit moet enige grootte wees wat ek verskaf het toe ek die voorwerp geskep het”.

__str__ en __repr__

__Str__

Dit is Python se towermetode wat ons toelaat om definish 'n beskrywing vir ons pasgemaakte item.

Wanneer jy 'n voorwerp druk of dit omskakel na 'n string met behulp van str(), Python kyk of jy het defiEk het met 'n metode vorendag gekom __str__ vir daardie voorwerp se klas.

Indien wel, gebruik daardie metode om die voorwerp na 'n string om te skakel.

Ons kan ons Pizza-voorbeeld uitbrei om 'n funksie in te sluit __str__ soos volg:

klas Pizza: def __init__(self, grootte, toppings): self.size = grootte self.toppings = toppings def __str__(self): gee terug f"A {self.size} pizza met {', '.join(self.toppings )}" my_pizza = Pizza('groot', ['pepperoni', 'sampioene']) print(my_pizza) # Dit sal druk: 'n Groot pizza met pepperoni, sampioene
__repr__

Die __str__ funksie is meer 'n informele manier om die eienskappe van 'n voorwerp te beskryf. Aan die ander kant word __repr__ gebruik om 'n meer formele, gedetailleerde en ondubbelsinnige beskrywing van die pasgemaakte voorwerp te verskaf.

As jy bel repr() op 'n voorwerp of jy tik net die voorwerpnaam in die konsole, Python sal 'n metode soek __repr__.

Se __str__ dit is nie definite, Python sal gebruik __repr__ as 'n rugsteun wanneer u probeer om die voorwerp te druk of dit na 'n string om te skakel. Dit is dus dikwels 'n goeie idee defimaak ten minste klaar __repr__, al doen jy dit nie defilekker __str__.

Hier is hoe ons kon defiklaarmaak __repr__ vir ons pizza voorbeeld:

klas pizza:
def __init__(self, grootte, toppings):
self.size = grootte
self.toppings = toppings

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

my_pizza = Pizza('groot', ['pepperoni', 'sampioene'])
print(repr(my_pizza)) # Dit sal druk: Pizza('groot', ['pepperoni', 'sampioene'])

__repr__ gee jou 'n string wat jy as 'n Python-opdrag kan uitvoer om die pizza-voorwerp te herskep, terwyl __str__ gee jou 'n meer menslike beskrywing. Ek hoop dit help jou om hierdie dunder-metodes 'n bietjie beter te kou!

__voeg__

In Python weet ons almal dat dit moontlik is om getalle by te voeg met die operateur +, Soos 3 + 5.

Maar wat as ons gevalle van een of ander pasgemaakte voorwerp wil byvoeg?

Die dunder-funksie __add__ dit laat ons toe om juis dit te doen. Dit gee ons die vermoë om definish die gedrag van die operateur + op ons persoonlike items.

In die belang van konsekwentheid, kom ons neem aan ons wil defivoltooi die gedrag van + op ons pizza voorbeeld. Kom ons sê dat wanneer ons twee of meer pizzas bymekaar voeg, dit outomaties al hul toppe sal kombineer. Hier is hoe dit kan lyk:

klas pizza:
def __init__(self, grootte, toppings):
self.size = grootte
self.toppings = toppings

def __add__ (self, ander):
indien nie 'n instansie is (ander, Pizza):
verhoog TypeError ("Jy kan net nog 'n pizza byvoeg!")
nuwe_toppings = self.toppings + ander.toppings
terugkeer Pizza (self.grootte, nuwe_toppings)

# Kom ons skep twee pizzas
pizza1 = Pizza('groot', ['pepperoni', 'sampioene'])
pizza2 = Pizza('groot', ['olywe', 'pynappel'])

# En kom ons "voeg hulle nou by".
gekombineerde_pizza = pizza1 + pizza2

print(combined_pizza.toppings) # Dit sal druk: ['pepperoni', 'sampioene', 'olywe', 'pynappel']

Soortgelyk aan dunder __add__, ons kan ook defivoltooi ander rekenkundige funksies soos __sub__ (deur aftrekking deur die operateur te gebruik -) En __mul__ (vir vermenigvuldiging deur die operateur te gebruik *).

__len__

Hierdie dunder metode laat ons toe defivoltooi wat die funksie len() moet terugstuur vir ons pasgemaakte items.

Python gebruik len() om die lengte of grootte van 'n datastruktuur soos 'n lys of string te kry.

In die konteks van ons voorbeeld kan ons sê dat die "lengte" van 'n pizza die aantal toppe is wat dit het. Hier is hoe ons dit kan implementeer:

klas pizza:
def __init__(self, grootte, toppings):
self.size = grootte
self.toppings = toppings

def __len__(self):
return len(self.toppings)

# Kom ons skep 'n pizza
my_pizza = Pizza('groot', ['pepperoni', 'sampioene', 'olywe'])

print(len(my_pizza)) # Dit sal druk: 3

In die __len__ metode gee ons net die lengte van die lys terug toppings. Nou, len(my_pizza) dit sal ons vertel hoeveel toppings daarop is my_pizza.

__ proses __

Hierdie dunder-metode laat voorwerpe herhaalbaar wees, dit wil sê dit kan in 'n for-lus gebruik word.

Om dit te doen, moet ons ook defivoltooi die funksie __next__, Dit word gebruik vir definish die gedrag wat die volgende waarde in die iterasie behoort terug te gee. Dit moet ook die iterable aandui op die gebeurtenis dat daar nie meer elemente in die ry is nie. Ons bereik dit gewoonlik deur 'n uitsondering te gooi StopIteration.

Vir ons pizza-voorbeeld, kom ons sê ons wil die toppe herhaal. Ons kan ons Pizza-klas herhaalbaar maak definendo 'n metode __iter__:

klas pizza:
def __init__(self, grootte, toppings):
self.size = grootte
self.toppings = toppings

def __iter__(self):
self.n = 0
gee self terug

def __volgende__(self):
if self.n < len(self.toppings):
resultaat = self.toppings[self.n]
self.n += 1
terugkeer resultaat
anders:
verhoog StopIteration

# Kom ons skep 'n pizza
my_pizza = Pizza('groot', ['pepperoni', 'sampioene', 'olywe'])

# En laat ons nou daaroor herhaal
vir bolaag in my_pizza:
druk (bolaag)

In hierdie geval, die vir lus oproepe __iter__, wat 'n teller inisialiseer (self.n) en gee die pizza-voorwerp self terug (self).

Dan, die vir lus oproepe __next__ om elke bolaag om die beurt te kry.

wanneer __next__ het al die geurmiddels teruggegee, StopIteration dit gooi 'n uitsondering en die for-lus weet nou dat daar nie meer toppings is nie en sal dus die iterasieproses staak.

Ercole Palmeri

Innovasie nuusbrief
Moenie die belangrikste nuus oor innovasie mis nie. Registreer om hulle per e-pos te ontvang.
Tags: python

Onlangse artikels

Die voordele van inkleurbladsye vir kinders - 'n wêreld van magie vir alle ouderdomme

Die ontwikkeling van fyn motoriese vaardighede deur inkleur berei kinders voor vir meer komplekse vaardighede soos skryf. Om in te kleur...

2 Mei 2024

Die toekoms is hier: hoe die verskepingsbedryf die wêreldekonomie revolusioneer

Die vlootsektor is 'n ware globale ekonomiese moondheid, wat na 'n 150 miljard-mark navigeer het ...

1 Mei 2024

Uitgewers en OpenAI onderteken ooreenkomste om die vloei van inligting wat deur Kunsmatige Intelligensie verwerk word, te reguleer

Verlede Maandag het die Financial Times 'n ooreenkoms met OpenAI aangekondig. FT lisensieer sy wêreldklas-joernalistiek ...

30 April 2024

Aanlynbetalings: Hier is hoe stroomdienste jou vir altyd laat betaal

Miljoene mense betaal vir stromingsdienste en betaal maandelikse intekengeld. Dit is algemene opinie dat jy...

29 April 2024