U ogromnom svijetu Python programiranja, postoji niz funkcija koje početnici često ne primjećuju, a ipak imaju značajan značaj u ekosistemu jezika.
Magične metode su skup pre metodadefinite u Pythonu koje pružaju posebne sintaktičke karakteristike. Lako se prepoznaju po dvostrukim crticama na početku i na kraju, kao __init__, __call__, __len__
… itd.
Magične metode dozvoljavaju prilagođenim objektima da se ponašaju slično kao ugrađeni Python tipovi.
U ovom članku ćemo se fokusirati na moćne dunder funkcije. Istražit ćemo njihovu svrhu i razgovarati o njihovoj upotrebi.
Bilo da ste početnik u Pythonu ili iskusni programer, ovaj članak ima za cilj da vam pruži sveobuhvatno razumijevanje Dunderovih funkcija, čineći vaše iskustvo kodiranja na Pythonu efikasnijim i ugodnijim.
Zapamtite, magija Pythona nije samo u njegovoj jednostavnosti i svestranosti, već i u njegovim moćnim karakteristikama kao što su Dunder funkcije.
Možda najosnovnija dunder funkcija od svih. Ovo je magična metoda koju Python automatski poziva kad god kreiramo (ili kako ime kaže, inicijaliziramo) novi objekat.__init__
klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings
# Sada napravimo pizzu
my_pizza = Pizza('velika', ['feferoni', 'pečurke'])
print(my_pizza.size) # Ovo će ispisati: veliko
print(my_pizza.toppings) # Ovo će ispisati: ['feferoni', 'gljive']
U ovom primjeru kreirana je klasa pod nazivom Pizza. Postavili smo našu __init__ funkciju da uključi parametre koje treba specificirati u vrijeme inicijalizacije i postavili smo ih kao svojstva za naš prilagođeni objekt.
Ovdje se koristi za predstavljanje instance klase. Dakle, kada napišemo self.size = size, kažemo: "Hej, ovaj pizza objekt ima atribut veličine size
, i želim da bude bilo koje veličine koju sam naveo kada sam kreirao objekat”.
Ovo je Pythonova magična metoda koja nam to omogućava defidovršite opis za naš prilagođeni artikl.
Kada odštampate objekat ili ga konvertujete u niz koristeći str()
, Python provjerite da li imate defiSmislio sam metodu __str__
za klasu tog objekta.
Ako je tako, koristite tu metodu za pretvaranje objekta u string.
Možemo proširiti naš primjer Pizze tako da uključimo funkciju __str__
kako slijedi:
class Pizza: def __init__(self, size, toppings): self.size = veličina self.toppings = toppings def __str__(self): return f"A {self.size} pizza sa {', '.join(self.toppings )}" my_pizza = Pizza('velika', ['feferoni', 'pečurke']) print(my_pizza) # Ovo će ispisati: Velika pica sa feferonima, gljivama
__repr__
Funkcija __str__ je više neformalni način opisivanja svojstava objekta. S druge strane, __repr__ se koristi za pružanje formalnijeg, detaljnijeg i nedvosmislenog opisa prilagođenog objekta.
Ako pozoveš repr()
na objektu ili samo ukucate ime objekta u konzolu, Python će tražiti metodu __repr__
.
Se __str__
nije definite, Python će koristiti __repr__
kao rezervnu kopiju kada pokušavate da odštampate objekat ili da ga konvertujete u niz. Tako da je to često dobra ideja defizavrši barem __repr__
, čak i ako ne defiizlazi __str__
.
Evo kako bismo mogli defizavršiti __repr__
za naš primjer pizze:
klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings
def __repr__(self):
return f"Pizza('{self.size}', {self.toppings})"
my_pizza = Pizza('velika', ['feferoni', 'pečurke'])
print(repr(my_pizza)) # Ovo će ispisati: Pizza('velika', ['feferoni', 'gljive'])
__repr__
daje vam niz koji možete pokrenuti kao Python naredbu za ponovno kreiranje pizza objekta, dok __str__
daje vam ljudskiji opis. Nadam se da će vam pomoći da malo bolje sažvakate ove glupe metode!
U Pythonu svi znamo da je moguće dodati brojeve pomoću operatora +
, dođi 3 + 5
.
Ali šta ako želimo da dodamo instance nekog prilagođenog objekta?
Dunder funkcija __add__
omogućava nam upravo to. Daje nam mogućnost da defiokončati ponašanje operatera +
na našim personalizovanim artiklima.
U interesu konzistentnosti, pretpostavimo da želimo defizavršiti ponašanje +
na našem primjeru pizze. Recimo da kad god dodamo dvije ili više pizza, automatski će se kombinirati svi njihovi dodaci. Evo kako bi to moglo izgledati:
klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings
def __dodaj__(sebe, drugo):
ako nije primjer (ostalo, pizza):
raise TypeError("Možete dodati samo još jednu pizzu!")
new_toppings = self.toppings + other.toppings
vrati pizzu (sobna veličina, novi_preljevi)
# Hajde da napravimo dve pice
pizza1 = Pizza('velika', ['feferoni', 'pečurke'])
pizza2 = Pizza('velika', ['masline', 'ananas'])
# A sada hajde da ih "dodamo".
kombinovana_pizza = pizza1 + pizza2
print(combined_pizza.toppings) # Ovo će ispisati: ['feferoni', 'gljive', 'masline', 'ananas']
Slično kao i dunder __add__
, možemo i mi defizavršiti druge aritmetičke funkcije kao što su __sub__
(oduzimanjem pomoću operatora -
) e __mul__
(za množenje pomoću operatora *
).
Ova dunder metoda nam to omogućava defizavrši ono što je funkcija len()
mora se vratiti za naše prilagođene artikle.
Python koristi len()
da dobijete dužinu ili veličinu strukture podataka kao što je lista ili string.
U kontekstu našeg primjera, mogli bismo reći da je "dužina" pizze broj preljeva koje ima. Evo kako bismo to mogli implementirati:
klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings
def __len__(self):
povratno sočivo (self.toppings)
# Hajde da napravimo pizzu
my_pizza = Pizza('velika', ['feferoni', 'gljive', 'masline'])
print(len(my_pizza)) # Ovo će ispisati: 3
U metodi __len__ vraćamo samo dužinu liste toppings
. Sad, len(my_pizza)
to će nam reći koliko je preliva na njemu my_pizza
.
Ova dunder metoda omogućava da objekti budu iterativni, tj. može se koristiti u for petlji.
Da bismo to uradili, moramo i mi defizavršiti funkciju __next__
, Ovo se koristi za defizavršiti ponašanje koje bi trebalo vratiti sljedeću vrijednost u iteraciji. Također bi trebao signalizirati iterable u slučaju da više nema elemenata u nizu. Obično to postižemo izbacivanjem izuzetka StopIteration
.
Za naš primjer pizze, recimo da želimo ponoviti dodatke. Mogli bismo naš čas pizze učiniti ponovljivim definendo a method __iter__
:
klasa pizza:
def __init__(self, veličina, dodaci):
self.size = veličina
self.toppings = toppings
def __iter__(self):
self.n = 0
vratiti sebe
def __sljedeći__(sam):
ako self.n < len(self.toppings):
rezultat = self.toppings[self.n]
self.n += 1
vratiti rezultat
drugo:
podići StopIteration
# Hajde da napravimo pizzu
my_pizza = Pizza('velika', ['feferoni', 'gljive', 'masline'])
# A sada hajde da ga ponovimo
za preljev u my_pizza:
print (preljev)
U ovom slučaju, for petlja poziva __iter__
, koji inicijalizira brojač (self.n)
i vraća sam objekt pice (self)
.
Zatim, pozivi petlje for __next__
da dobijete svaki preliv redom.
Kada __next__
vratio sve začine, StopIteration
izbacuje izuzetak i for petlja sada zna da nema više dodataka i stoga će prekinuti proces iteracije.
Ercole Palmeri
Excel pruža širok raspon statističkih funkcija koje izvode proračune od osnovne srednje vrijednosti, medijane i moda do distribucije…
Zaokretne tablice su tehnika analize proračunskih tablica. Omogućavaju potpunom početniku bez iskustva…
U nastavku slijedi drugi i posljednji članak ovog biltena posvećen odnosu privatnosti i autorskih prava od…
Projekat ACTEA, ENEA i Univerzitet Sapienza u Rimu će razviti nove kalcijum-jonske baterije. Nove kalcijum-jonske baterije kao alternativa…
Preko 900 ortopedskih hirurga stopala i skočnog zgloba, naprednih zdravstvenih radnika, specijalizanata ortopeda i studenata medicine prisustvovalo je…
Prema najnovijem izvještaju Protolabsa o robotici za proizvodnju, gotovo trećina (32%) ispitanika vjeruje da će u narednih nekoliko godina…
CNH je snažno posvećen razvoju svoje tehnologije kako bi poljoprivredu učinio jednostavnijom, efikasnijom i održivijom za svoje…
Strateški potez će omogućiti brži razvoj za usvajanje privatnog 5G ekosistema za sve digitalne uređaje NTT otkriva…
Neuralink, neurotehnološki startup u vlasništvu Elona Muska, nedavno je najavio da će početi regrutirati pacijente za svoje…
Ovo je prvi od dva članka u kojima govorim o delikatnom odnosu između privatnosti i autorskih prava s jedne strane,…