U golemom svijetu programiranja Pythona postoji niz značajki koje početnici često prođu nezapaženo, a ipak imaju značajnu važnost u ekosustavu jezika.
Čarobne metode su skup prethodnih metodadefinites u Pythonu koji pružaju posebne sintaktičke značajke. Lako ih je prepoznati po duplim crticama na početku i na kraju, npr __init__, __call__, __len__
… itd.
Čarobne metode omogućuju prilagođenim objektima da se ponašaju slično ugrađenim tipovima Pythona.
U ovom ćemo se članku usredotočiti 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, cilj ovog članka je pružiti vam sveobuhvatno razumijevanje funkcija Dundera, čineći vaše iskustvo kodiranja u Pythonu učinkovitijim i ugodnijim.
Zapamtite, magija Pythona ne leži samo u njegovoj jednostavnosti i svestranosti, već iu njegovim moćnim značajkama kao što su Dunder funkcije.
Možda najosnovnija dunder funkcija od svih. Ovo je čarobna metoda koju Python automatski poziva kad god stvorimo (ili kako naziv sugerira, inicijaliziramo) novi objekt.__init__
klasa Pizza:
def __init__(self, size, toppings):
self.size = veličina
sam.preljevi = preljevi
# Sada napravimo pizzu
my_pizza = Pizza('velika', ['feferoni', 'gljive'])
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 objekt za pizzu ima atribut size size
, i želim da bude bilo koje veličine koju sam naveo kada sam kreirao objekt”.
Ovo je Pythonova čarobna metoda koja nam omogućuje defidonesite opis za našu prilagođenu stavku.
Kada ispisujete objekt ili ga pretvarate u niz pomoću str()
, Python provjerite ako imate defiSmislio sam metodu __str__
za klasu tog objekta.
Ako je tako, upotrijebite tu metodu za pretvaranje objekta u niz.
Možemo proširiti naš primjer pizze da uključi funkciju __str__
kako slijedi:
class Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): return f"A {self.size} pizza sa {', '.join(self.toppings )}" my_pizza = Pizza('large', ['pepperoni', 'mushrooms']) print(my_pizza) # Ovo će ispisati: Velika pizza s feferonima, gljivama
__repr__
Funkcija __str__ više je neformalan način opisivanja svojstava objekta. S druge strane, __repr__ se koristi za pružanje formalnijeg, detaljnijeg i nedvosmislenog opisa prilagođenog objekta.
Ako nazoveš repr()
na objektu ili samo upišete naziv objekta u konzolu, Python će potražiti metodu __repr__
.
Se __str__
nije definite, Python će koristiti __repr__
kao rezervna kopija kada pokušavate ispisati objekt ili ga pretvoriti u niz. Stoga je to često dobra ideja defizavrši barem __repr__
, čak i ako nemate defiizlazi __str__
.
Evo kako bismo mogli defiZavrši __repr__
za naš primjer pizze:
klasa Pizza:
def __init__(self, size, toppings):
self.size = veličina
sam.preljevi = preljevi
def __repr__(self):
return f"Pizza('{self.size}', {self.toppings})"
my_pizza = Pizza('velika', ['feferoni', 'gljive'])
print(repr(my_pizza)) # Ovo će ispisati: Pizza('large', ['feferoni', 'mushrooms'])
__repr__
daje vam niz koji možete pokrenuti kao Python naredbu za ponovno stvaranje objekta pizza, dok __str__
daje vam ljudskiji opis. Nadam se da će vam pomoći da malo bolje prožvačete ove dunder metode!
U Pythonu svi znamo da je moguće zbrajati brojeve pomoću operatora +
, Kao 3 + 5
.
Ali što ako želimo dodati instance nekog prilagođenog objekta?
Dunderova funkcija __add__
omogućuje nam upravo to. Daje nam mogućnost da definish ponašanje operatera +
na našim personaliziranim artiklima.
U interesu dosljednosti, pretpostavimo da to želimo defizavršiti ponašanje +
na našem primjeru pizze. Recimo da kad god dodamo dvije ili više pizza zajedno, automatski će kombinirati sve njihove nadjeve. Evo kako bi to moglo izgledati:
klasa Pizza:
def __init__(self, size, toppings):
self.size = veličina
sam.preljevi = preljevi
def __add__(self, other):
ako nije isinstance(ostalo, pizza):
raise TypeError("Možete dodati samo još jednu pizzu!")
novi_preljevi = samo.preljevi + drugi.preljevi
return Pizza(self.size, new_toppings)
# Napravimo dvije pizze
pizza1 = Pizza('velika', ['feferoni', 'gljive'])
pizza2 = Pizza('velika', ['masline', 'ananas'])
# A sada ih "dodajmo".
kombinirana_pizza = pizza1 + pizza2
print(combined_pizza.toppings) # Ovo će ispisati: ['feferoni', 'gljive', 'masline', 'ananas']
Slično dunderu __add__
, možemo i mi defizavršiti druge aritmetičke funkcije kao što su __sub__
(oduzimanjem pomoću operatora -
) I __mul__
(za množenje pomoću operatora *
).
Ova dunder metoda nam omogućuje da defizavršiti ono što funkcija len()
mora se vratiti po naše prilagođene artikle.
Python koristi len()
da biste dobili duljinu ili veličinu strukture podataka kao što je popis ili niz.
U kontekstu našeg primjera, mogli bismo reći da je "duljina" pizze broj nadjeva koji ima. Evo kako bismo to mogli implementirati:
klasa Pizza:
def __init__(self, size, toppings):
self.size = veličina
sam.preljevi = preljevi
def __len__(self):
povratak len(self.toppings)
# Kreirajmo pizzu
my_pizza = Pizza('velika', ['feferoni', 'gljive', 'masline'])
print(len(my_pizza)) # Ovo će ispisati: 3
U metodi __len__ vraćamo samo duljinu popisa toppings
. Sada, len(my_pizza)
reći će nam koliko je preljeva na njemu my_pizza
.
Ova dunder metoda omogućuje da se objekti mogu ponavljati, tj. može se koristiti u for petlji.
Da bismo to učinili, moramo također defizavršiti funkciju __next__
, Ovo se koristi za defiuništite 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. To obično postižemo bacanjem iznimke StopIteration
.
Za naš primjer pizze, recimo da želimo ponavljati nadjeve. Mogli bismo učiniti da se naš tečaj pizze ponavlja definendo metoda __iter__
:
klasa Pizza:
def __init__(self, size, toppings):
self.size = veličina
sam.preljevi = preljevi
def __iter__(self):
samo.n = 0
vratiti sebe
def __next__(self):
if self.n < len(self.toppings):
rezultat = sam.preljevi[sebe.n]
sebe.n += 1
vratiti rezultat
drugo:
podići StopIteration
# Kreirajmo pizzu
my_pizza = Pizza('velika', ['feferoni', 'gljive', 'masline'])
# A sada ponovimo to
za nadjev u mojoj_pizzi:
print (preljev)
U ovom slučaju, poziva se for petlja __iter__
, koji inicijalizira brojač (self.n)
i vraća sam objekt pizze (self)
.
Zatim se poziva for petlja __next__
da dobijete svaki preljev redom.
kada __next__
vratio sve začine, StopIteration
izbacuje iznimku i for petlja sada zna da više nema dodavanja i stoga će prekinuti proces ponavljanja.
Ercole Palmeri
Pomorski sektor je prava globalna gospodarska sila, koja je krenula prema tržištu od 150 milijardi...
Prošlog ponedjeljka, Financial Times je najavio dogovor s OpenAI-jem. FT licencira svoje novinarstvo svjetske klase...
Milijuni ljudi plaćaju usluge strujanja, plaćajući mjesečne pretplate. Uvriježeno je mišljenje da ste…
Coveware by Veeam nastavit će pružati usluge odgovora na incidente cyber iznude. Coveware će ponuditi forenziku i mogućnosti sanacije...