Python-ohjelmoinnin valtavassa maailmassa on joukko ominaisuuksia, jotka jäävät usein aloittelijoille huomaamatta, mutta joilla on kuitenkin merkittävä merkitys kielen ekosysteemissä.
Taikamenetelmät ovat joukko esimenetelmiädefinites Pythonissa, jotka tarjoavat erityisiä syntaktisia ominaisuuksia. Ne on helppo tunnistaa niiden kaksoisviivan alussa ja lopussa, kuten __init__, __call__, __len__
… jne.
Taikamenetelmät sallivat mukautettujen objektien käyttäytymisen samalla tavalla kuin sisäänrakennetut Python-tyypit.
Tässä artikkelissa keskitymme tehokkaisiin dunder-toimintoihin. Selvitämme niiden tarkoitusta ja keskustelemme niiden käytöstä.
Olitpa Python-aloittelija tai kokenut ohjelmoija, tämän artikkelin tavoitteena on antaa sinulle kattava käsitys Dunderin toiminnoista, mikä tekee Python-koodauskokemuksestasi tehokkaampaa ja nautinnollisempaa.
Muista, että Pythonin taika ei piile vain sen yksinkertaisuudessa ja monipuolisuudessa, vaan myös sen tehokkaissa ominaisuuksissa, kuten Dunder-toiminnoissa.
Ehkä yksinkertaisin dunder-toiminto kaikista. Tämä on maaginen menetelmä, jota Python kutsuu automaattisesti aina, kun luomme (tai nimensä mukaisesti alustamme) uuden objektin.__init__
luokan pizza:
def __init__(itse, koko, täytteet):
itse.koko = koko
itse.täytteet = täytteet
# Luodaan nyt pizza
my_pizza = Pizza('iso', ['pippuri', 'sienet'])
print(my_pizza.size) # Tämä tulostaa: suuri
print(my_pizza.toppings) # Tämä tulostaa: ['pepperoni', 'sienet']
Tässä esimerkissä luodaan luokka nimeltä Pizza. Asetimme __init__-funktion sisältämään parametrit, jotka määritetään alustuksen yhteydessä, ja asetamme ne mukautetun objektimme ominaisuuksiksi.
Tässä sitä käytetään edustamaan luokan esiintymää. Joten kun kirjoitamme self.size = koko, sanomme: "Hei, tällä pizzaobjektilla on määritekoko size
, ja haluan sen olevan sen kokoinen, minkä annoin objektia luodessaan."
Tämä on Pythonin taikamenetelmä, jonka avulla voimme defianna kuvaus mukautetulle tuotteellemme.
Kun tulostat objektin tai muunnat sen merkkijonoksi käyttämällä str()
, Python tarkista, jos sinulla on defiOlen keksinyt menetelmän __str__
objektin luokalle.
Jos näin on, käytä tätä menetelmää objektin muuntamiseen merkkijonoksi.
Voimme laajentaa pizzaesimerkkiämme sisältämään toiminnon __str__
seuraavasti:
luokka Pizza: def __init__(itse, koko, täytteet): self.size = koko self.toppings = täytteet def __str__(self): return f"{self.size} pizza, jossa on {', '.join(self.toppings) )}" my_pizza = Pizza('suuri', ['pippuri', 'sienet']) print(oma_pizza) # Tämä tulostaa: Iso pizza pepperonilla, sieniä
__repr__
Funktio __str__ on enemmän epävirallinen tapa kuvata objektin ominaisuuksia. Toisaalta __repr__ käytetään tarjoamaan muodollisempi, yksityiskohtaisempi ja yksiselitteisempi kuvaus mukautetusta objektista.
Jos soitat repr()
objektiin tai kirjoitat vain objektin nimen konsoliin, Python etsii menetelmää __repr__
.
Se __str__
se ei ole definite, Python käyttää __repr__
varmuuskopiona, kun yrität tulostaa objektin tai muuntaa sen merkkijonoksi. Joten se on usein hyvä idea defiloppuun ainakin __repr__
, vaikka et tekisi defitulee ulos __str__
.
Näin voimme defisuorittaa loppuun __repr__
pizzaesimerkillemme:
luokan pizza:
def __init__(itse, koko, täytteet):
itse.koko = koko
itse.täytteet = täytteet
def __repr__(itse):
return f"Pizza('{self.size}', {self.toppings})"
my_pizza = Pizza('iso', ['pippuri', 'sienet'])
print(repr(oma_pizza)) # Tämä tulostaa: Pizza('suuri', ['pepperoni', 'sienet'])
__repr__
antaa sinulle merkkijonon, jonka voit suorittaa Python-komentona pizza-objektin luomiseksi uudelleen __str__
antaa sinulle inhimillisemmän kuvauksen. Toivottavasti se auttaa sinua pureskelemaan näitä dunder-menetelmiä hieman paremmin!
Pythonissa me kaikki tiedämme, että on mahdollista lisätä numeroita käyttämällä operaattoria +
, Kuten 3 + 5
.
Mutta entä jos haluamme lisätä jonkin mukautetun objektin esiintymiä?
Dunder-toiminto __add__
se antaa meille mahdollisuuden tehdä juuri niin. Se antaa meille kyvyn defioperaattorin käyttäytymistä +
henkilökohtaisissa tuotteissamme.
Johdonmukaisuuden vuoksi oletetaan, että haluamme defilopeta käyttäytyminen +
pizzaesimerkissämme. Oletetaan, että aina kun lisäämme kaksi tai useampi pizza yhteen, se yhdistää automaattisesti kaikki niiden täytteet. Tältä se saattaa näyttää:
luokan pizza:
def __init__(itse, koko, täytteet):
itse.koko = koko
itse.täytteet = täytteet
def __add__(itse, muu):
jos ei isinstance (muu, pizza):
raise TypeError("Voit lisätä vain toisen pizzan!")
uudet_täytteet = itse.täytteet + muut.täytteet
palauta pizza (omakokoinen, uudet_täytteet)
# Tehdään kaksi pizzaa
pizza1 = Pizza('iso', ['pepperoni', "sienet"])
pizza2 = Pizza('iso', ['oliivit', "ananas"])
# Ja nyt "lisäätään" ne
yhdistetty_pizza = pizza1 + pizza2
print(combined_pizza.toppings) # Tämä tulostaa: ['pippuri', 'sienet', 'oliivit', 'ananas']
Samoin kuin dunder __add__
, voimme myös defiViimeistele muut aritmeettiset funktiot, kuten __sub__
(vähennyksellä käyttämällä operaattoria -
) Ja __mul__
(kertomista varten operaattorilla *
).
Tämä dunder-menetelmä antaa meille mahdollisuuden defilopeta mikä toiminto on len()
täytyy palauttaa räätälöityjä tuotteita varten.
Python käyttää len()
saadaksesi tietorakenteen, kuten luettelon tai merkkijonon, pituuden tai koon.
Esimerkkimme yhteydessä voisimme sanoa, että pizzan "pituus" on siinä olevien täytteiden lukumäärä. Näin voimme toteuttaa sen:
luokan pizza:
def __init__(itse, koko, täytteet):
itse.koko = koko
itse.täytteet = täytteet
def __len__(itse):
paluulinssi (self. täytteet)
# Tehdään pizza
my_pizza = Pizza('iso', ['pepperoni', "sienet", "oliivit"])
print(len(my_pizza)) # Tämä tulostaa: 3
__len__-menetelmässä palautetaan vain luettelon pituus toppings
. Nyt, len(my_pizza)
se kertoo meille kuinka monta täytettä siinä on my_pizza
.
Tämä dunder-menetelmä mahdollistaa objektien iteroitavuuden, eli sitä voidaan käyttää for-silmukassa.
Tämän tekemiseksi meidän on myös defilopeta toiminto __next__
, Tätä käytetään defiSelvitä käyttäytyminen, jonka pitäisi palauttaa seuraava arvo iteraatiossa. Sen tulisi myös ilmoittaa iteroitavalle tapahtumalle, että sekvenssissä ei ole enää elementtejä. Yleensä saavutamme tämän tekemällä poikkeuksen StopIteration
.
Oletetaan pizzaesimerkissämme, että haluamme toistaa täytteet. Voisimme tehdä pizzaluokistamme toistettavan defiälä anna menetelmää __iter__
:
luokan pizza:
def __init__(itse, koko, täytteet):
itse.koko = koko
itse.täytteet = täytteet
def __iter__(itse):
itse.n = 0
palauta itsesi
def __seuraava__(itse):
jos itse.n < len(itse.täytteet):
tulos = self.topings[self.n]
itse.n += 1
palauttaa tuloksen
else:
nosta StopIteration
# Tehdään pizza
my_pizza = Pizza('iso', ['pepperoni', "sienet", "oliivit"])
# Ja nyt toistellaan sitä
täytteeksi my_pizzassa:
tulostaa (päällystys)
Tässä tapauksessa for-silmukka kutsuu __iter__
, joka alustaa laskurin (self.n)
ja palauttaa itse pizzaesineen (self)
.
Sitten for-silmukan kutsut __next__
saadaksesi jokaisen täytteen vuorotellen.
kun __next__
palautti kaikki mausteet, StopIteration
se heittää poikkeuksen ja for-silmukka tietää nyt, että täytettä ei ole enää, joten se keskeyttää iteraatioprosessin.
Ercole Palmeri
Veeamin Coveware tarjoaa jatkossakin kyberkiristystapahtumien reagointipalveluita. Coveware tarjoaa rikosteknisiä ja korjaavia ominaisuuksia…
Ennakoiva huolto mullistaa öljy- ja kaasualan innovatiivisella ja ennakoivalla lähestymistavalla laitosten hallintaan.…
Britannian CMA on antanut varoituksen Big Techin käyttäytymisestä tekoälymarkkinoilla. Siellä…
Euroopan unionin rakennusten energiatehokkuuden parantamiseksi laatima "Green Houses" -asetus on saanut lainsäädäntöprosessinsa päätökseen…